1

udp ソケットを使用してサーバーを作成しています。クライアントが最初のメッセージを送信して接続した後、新しいソケットを開き、このソケット (リッスン用の最初のソケット) でこのクライアントと通信し、各クライアントのスレッドを作成します。しかし、スレッドでは、クライアントがデータを送信するたびに recvfrom がデータを受信するため、while ループは無限に進みます。私のコードの問題は何ですか?

以下のコードサンプル:

int main()
{

    .....

      // creating socket
 if( (sock = socket(AF_INET, SOCK_DGRAM, 0) ) == -1 )
 {
  perror("Socket cannot be created\n");
  return FAILURE;
 }

    .....

        for(; ;)
 {

  // TAKE CLIENTS INFORMATION
  /**************************************/ 
  recvfrom(sock, &client, sizeof(Client), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size);  //1 

       .......

                if( (sock2 = socket(AF_INET, SOCK_DGRAM, 0) ) == -1 )
  { 
   perror("Socket cannot be created\n");
   return FAILURE;
  }

                client.sock = sock2;

                ...

               pthread_create(thid+num_client-1, NULL, messanger, (void*)(clients + num_client-1));


        } // end of for loop
 }// end of main


// thread function
void *messanger(void *argClient)
{
     Client client = *(Client*)argClient;
     ...

     while(strcmp(message.buffer, "exit") != 0)
     { 
 recvfrom(client.sock, &message, sizeof(Message), MSG_WAITALL, (struct sockaddr *)&clientAddr, &size);
 printf("%s\n", message.buffer);

     }// this file loops infinetely altough client does not send data. Printf prints onln new line

}
4

2 に答える 2

1

bind()2 番目のソケット (または最初のソケット) はどこにありますか? なぜrecvfrom()失敗をチェックしないのですか?

とにかく、これはUDPサーバーを書く方法ではありません。単一のソケットを使用してすべてのパケットを受信します。次に、送信者アドレスを検査し、適切なクライアントと照合して、適切に処理します (たとえば、クライアントごとのスレッドの作業キューに入れ、 を使用してそのスレッドをウェイクアップできますpthread_cond_signal())。

于 2010-11-19T13:59:44.527 に答える
0

あなたは忙しいです-待っています。代わりに、ポーリングまたは選択を使用してみてください。

于 2010-11-19T14:53:35.477 に答える