gpt4 book ai didi

c - recvfrom无限接收问题

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:20 25 4
gpt4 key购买 nike

我正在使用 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

}

最佳答案

你在哪里 bind() 第二个套接字(或第一个,就此而言)?为什么不检查 recvfrom() 是否失败?

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

关于c - recvfrom无限接收问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4225611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com