send
を使用する前にソケットが書き込み可能かどうかを確認しようとしています。ソケットの読み込みバッファがいっぱいでない限り、これはうまくいきます。少なくともselect
のタイムアウトです(少なくともそれは私が期待しているものです。つまり、動作は、recv
を使わないで多くのデータを送信した後です.select
は0を返します。もう一度やり直してください。通常は再び動作します)。私は、完全な読み取りバッファが送信を妨げないことを期待しています。何が間違っているのですか?読み取りバッファがいっぱいになっているときにselectで書き込み可能なソケットを確認してください
int testwriteable(SOCKET socket) {
timeval timeout;
timeout.tv_sec = 0;
timeout.tv_usec = 100; //100 us (microseconds)
fd_set set;
FD_ZERO(&set);
FD_SET(socket, &set);
//check for writable
return select(1, NULL, &set, NULL, &timeout);
}
再現できません(Win 10 64ビット、VS 2015 R3)。この全機能は私にとって打撃を与えますが、あなたは単一のソケットで多くの作業を行い、返される情報の価値は疑わしいものです。おそらくあなたはあなたの関数がSOCKET_ERRORを返すのをチェックしていて、ソケットが書き込み可能なので、あなたはそれに提示したいデータの*すべて*を受け入れるだろうと仮定していませんか? – kfsone