我正在使用udp socket编写服务器。在客户端发送第一条连接消息后,我打开新套接字与此套接字上的此客户端通信(第一个用于侦听的套接字),并为每个客户端创建一个线程。但是在线程中,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
}
答案 0 :(得分:1)
你在哪里bind()
第二个套接字(或者第一个套接字)?你为什么不检查recvfrom()
失败?
无论如何,这不是编写UDP服务器的方法。您使用单个套接字来接收所有数据包。然后检查发件人地址,将其与正确的客户端匹配并根据需要进行处理(例如,您可以将其放入每个客户端线程的工作队列中,然后使用pthread_cond_signal()
唤醒该线程)
答案 1 :(得分:0)
你在忙着等待。尝试使用民意调查或选择。