gpt4 book ai didi

c - 异步udp服务器客户端应用程序

转载 作者:行者123 更新时间:2023-11-30 15:49:53 25 4
gpt4 key购买 nike

我正在尝试制作一个异步 UDP 聊天应用程序,目前只有一个客户端和服务器。

当我运行我的服务器时,会显示大量冗余数据。之后,当输入一些文本时,

Error sending the file!

显示。

有人可以看一下代码并让我知道哪里出了问题吗?

服务器:
u_long iMode=1; ioctlsocket(sd,FIONBIO,&iMode); int n=sd+1;

fd_set readfds,writefds;
while(1)
{
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(sd,&readfds);
FD_SET(sd,&writefds);

int rv = select(n, &readfds, &writefds, NULL, NULL);
if(rv==-1)
{
printf("Error in Select!!!\n");
exit(0);
}
if(rv==0)
{
printf("Timeout occurred\n");
}
if (FD_ISSET(sd, &readfds))
{
FD_CLR(sd,&readfds);
int client_length = (int)sizeof(struct sockaddr_in);
memset(&buffer,0,sizeof(buffer));
int bytes_received = recvfrom(sd, buffer,SIZE, 0, (struct sockaddr *)&client, &client_length);
if (bytes_received < 0)
{
fprintf(stderr, "Could not receive datagram.\n");
closesocket(sd);
WSACleanup();
exit(0);
}
}

printf("\nClient says: %s",buffer);
printf("\nWrite :");

fgets(buffer,SIZE,stdin);
if(FD_ISSET(sd,&writefds))
{
FD_CLR(sd,&writefds);
int client_length = (int)sizeof(struct sockaddr_in);
if(sendto(sd, buffer,strlen(buffer), 0, (struct sockaddr *) &client,client_length)<0)
{
printf("Error sending the file! \n");
exit(1);
}
}
}
closesocket(sd);
WSACleanup();

return 0;
}

最佳答案

我发现一个问题。这一行:

int rv = select(n, &readfds, &writefds, NULL, NULL);

几乎总是会立即返回,且 readfds 为空。但是 writefds 几乎总是会使用“sd”套接字进行设置,表明它已准备好写入/发送。

因此,您的代码正确地跳过了调用 recvfrom() 的尝试,但没有什么可以阻止它落入发送代码路径。所有变量(例如 client、client_length 和 buffer)此时可能尚未初始化。或者更糟糕的是,缓冲区和客户端与循环中上次成功调用时的状态完全相同。这可能解释了冗余数据。

我的建议是根本不要在 select 调用中设置“writefds”。然后只有当你真正阅读时才“发送”。无论如何,sendto 调用不会阻塞很长时间。

关于c - 异步udp服务器客户端应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16034064/

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