1

我正在使用 udp 套接字编写服务器。在客户端发送第一条消息进行连接后,我打开新套接字以在此套接字上与该客户端通信(用于侦听的第一个套接字)并为每个客户端创建一个线程。但是在线程中,while 循环会无限进行,因为 recvfrom 每次都接收数据,尽管任何客户端都发送数据。我的代码有什么问题?

下面的代码示例:

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()在哪里第二个插座(或第一个,就此而言)?你为什么不检查recvfrom()失败?

无论如何,这不是编写 UDP 服务器的方法。您使用单个套接字接收所有数据包。然后检查发件人地址,将其与正确的客户端匹配并进行适当处理(例如,您可以将其放入每个客户端线程的工作队列中,然后使用 唤醒该线程pthread_cond_signal())。

于 2010-11-19T13:59:44.527 回答
0

你正忙着等。尝试使用 poll 或 select 代替。

于 2010-11-19T14:53:35.477 回答