0

cでtcp/ipを使用してチャットサーバーとクライアントを作成しています。複数のクライアントをスレッド化するサーバー部分を作成しました。クライアント側では、行を送信してサーバーの応答を待つことができるwhileループがあります。クライアントにsend関数とrecv関数の両方をポーリングさせて、別のクライアントが何かを送信したかどうかを確認したいと思います。これは私が持っているものです-

while (1){
    char buffer[BUFLEN];
    memset(buffer, 0, sizeof buffer);
    gets(buffer);
    //sendall(sd, buffer, BUFLEN);
    send(sd, buffer, BUFLEN, 0);
    printf("sent:%s\n",buffer);
    //recvline(sd, buffer, BUFLEN);
    recv(sd, buffer, BUFLEN, 0);
    printf("recieved:%s\n", buffer);
}

send()とrecv()の両方を同時にポーリングして、最初に来るものを実行するにはどうすればよいですか?

このようなことをしたい。

if(send(sd, buffer, BUFLEN, 0) == true)
   send something
else if(recv(sd, buffer, BUFLEN, 0) == true)
   receive something
4

1 に答える 1

2

selectMSDNページmanページ)のようなものを探していると思います。

使用の基本は次のとおりです。

  • fd_set確認したいソケットハンドルを使用して構造体をロードします。受信する新しいデータをチェックするソケットを1つ、送信するソケットを1つ、オプションでエラーをチェックするソケットを1つロードfd_setします。

  • を呼び出しselect、構造体へのポインタを渡しますfd_set

  • 戻るときselect、2番目のパラメーター(readfds)として渡したセットには、データを待機している渡したソケットのみが含まれます。あなたはそれらを呼び出すことができrecv、それはすぐに戻ります。3番目のパラメーター(writefds)として渡したセットには、書き込みの準備ができているソケットが含まれています。あなたはそれらを呼び出すことができsend、それはすぐに戻ります。

于 2012-10-27T23:56:47.020 に答える