【发布时间】:2013-04-16 20:28:37
【问题描述】:
我正在尝试制作一个异步 UDP 聊天应用程序,目前只有一个客户端和服务器。
当我运行我的服务器时,会显示很多冗余数据。之后,当输入一些文本时,
发送文件时出错!
显示出来。
有人可以看看代码并告诉我哪里出错了吗?
服务器:
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;
}
【问题讨论】:
-
首先,您不需要从集合中手动清除套接字(例如
FD_CLR调用)。在select调用之前,您无论如何都要重置设置。 -
其次,不要在您的
memset通话中使用&buffer。如果buffer是一个指针,它不会做它认为的事情。此外,如果buffer是一个指针,那么sizeof(buffer)将返回 指针 的大小,而不是它所指向的大小。 -
调用 sendto 失败后 WSAGetLastError 返回什么?
-
@JoachimPileborg,buffer 是数组的名称...
-
最后,您显示的代码中没有任何地方可以打印
"Error Transmitting data"。这是您向我们展示的正确代码吗?