0

クライアントからのソケット接続が利用可能かどうかを確認する C 関数を作成しています。入力バッファを変更しないように、MSG_PEEK で「recv」関数を使用します。

ただし、ソケット接続がクライアントによって閉じられると、'recv' は -1 を返すはずですが、そうではありません。クライアントが閉じた後、以下の関数の「recv」は常に 0 を返します。

char is_avail(int connection) {
  char buffer;

  int result = recv(connection,&buffer,1,MSG_PEEK);
  if (result<0)
    return 0;
  else
    return 1;
}

この件について何か理由はありますか?また、MSG_PEEK と MSG_WAITALL を組み合わせたいと考えています。私は試した:

recv(connection,&buffer,1,MSG_PEEK|MSG_WAITALL);

しかし、それは効果がありません。

4

1 に答える 1

5

ソケットが適切に閉じられている場合、recv は -1 を返しませんが、'0' を返します。

0 -> ソケットの適切なクローズ

-1-> 実際にエラーが発生しました

> 0-> データが読み取られました。

于 2012-08-21T07:44:16.560 に答える