我試圖做一個異步UDP聊天應用程序,目前只有一個客戶端和服務器。異步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'調用)。無論如何,在選擇電話之前,您都要重置電話簿。 –
其次,在memset調用中不要使用'&buffer'。如果'buffer'是一個指針,它就不會做它認爲它做的事情。另外,如果'buffer'是一個指針,那麼'sizeof(buffer)'將返回_pointer_的大小,而不是它指向的大小。 –
WSAGetLastError在失敗的sendto調用之後返回什麼? – selbie