BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / soft-design / #23820同步于 2008/1/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SoftDesign机器人发帖

急!一个关于recvfrom的问题!!!奇怪啊

honeysuckle
2008/1/3镜像同步3 回复
问题写在程序的注释中,高人指点一下啊,不胜感激!!! /* 客户端的程序 */ #include<iostream> #include<string> #include<winsock2.h> #pragma comment( lib, "Ws2_32.lib" ) using namespace std; int main() { SOCKET clientSock; struct sockaddr_in local,from; WSADATA wsadata; unsigned short port=0; char ip[16]; memset(ip,'\0',sizeof(ip)); cout<<"请输入服务器的ip地址:"; cin>>ip; cout<<"请输入服务器的端口号:"; cin>>port; if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0) { cout<<"无法启winsock"<<endl; return 0; } from.sin_family=AF_INET; from.sin_port=htons(port); from.sin_addr.S_un.S_addr=inet_addr(ip); clientSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(clientSock==INVALID_SOCKET) { cout<<"无法为client创建socket"<<endl; WSACleanup(); return 0; } local.sin_family=AF_INET; local.sin_port=htons(0); local.sin_addr.S_un.S_addr=htonl(INADDR_ANY); if(bind(clientSock,(struct sockaddr*)&local,sizeof(local))!=0) { cout<<"无法绑定"<<endl; closesocket(clientSock); WSACleanup(); return 0; } char nak[1]; nak[0]='i'; int fromLen=sizeof(from); int send=sendto(clientSock,nak,sizeof(nak),0,(struct sockaddr*)&from,fromLen); recvfrom(clientSock,nak,sizeof(nak),0,(struct sockaddr*)&from,&fromLen); cout<<"error:"<<WSAGetLastError()<<endl; /* 服务器端口号是5000 往服务器发送1字节的数据,但是没有启动5000端口的UDP Server程序。 sendto函数依然能够将返回1。----- 这是合理的。 */ /*???????????? (1)奇怪的是此时如果sendto的目的地址是127.0.0.1或者本机的IP,recvfrom会立即返回-1,如果调用WSAGetLastError将返回10054, 表示"远程主机强迫关闭了现有的一个连接"。奇怪,这明明是UDP,何来连接?? 但如果sendto的目的地址不是127.0.0.1或者本机的IP,recvfrom会阻塞在那里---这是合理的 (2)如果不调用sendto函数,直接调用recvfrom(),则recvfrom()将阻塞在这里,不返回。---- 这是合理的 (3)如果启动启动5000端口的UDP Server程序,也不会有什么问题。如果UDP Server收到消息什么都不作反应, 该recvfrom将阻塞在这里,如果UDP Server沿原路返回消息,该recvfrom将收到UDP Server发回的消息。---- 这是合理的 */ closesocket(clientSock); WSACleanup(); return 0; } /* 服务器端的程序 */ #include<iostream> #include<winsock2.h> #pragma comment( lib, "Ws2_32.lib" ) using namespace std; int main() { SOCKET serverSock; struct sockaddr_in local,from; WSADATA wsadata; if(WSAStartup(MAKEWORD(2,2),&wsadata)!=0) { cout<<"无法启winsock"<<endl; return 0; } serverSock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(serverSock==INVALID_SOCKET) { cout<<"无法为server创建socket"<<endl; return 0; } local.sin_family=AF_INET; local.sin_port=htons(5000); local.sin_addr.S_un.S_addr=htonl(INADDR_ANY); if(bind(serverSock,(struct sockaddr*)&local,sizeof(local))!=0) { cout<<"无法绑定"<<endl; closesocket(serverSock); return 0; } char nak[1]; nak[0]='i'; int fromLen=sizeof(from); int ret=recvfrom(serverSock,nak,1,0,(struct sockaddr*)&from,&fromLen); int send=sendto(serverSock,nak,sizeof(nak),0,(struct sockaddr*)&from,fromLen); closesocket(serverSock); WSACleanup(); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
3 条回复
difuk机器人#1 · 2008/1/3
难道是测的时候本地没开server程序?
honeysuckle机器人#2 · 2008/1/3
就是在没开的时候测,不然还发现不了这个问题 【 在 difuk 的大作中提到: 】 : 难道是测的时候本地没开server程序?
difuk机器人#3 · 2008/1/3
【 在 honeysuckle 的大作中提到: 】 : 就是在没开的时候测,不然还发现不了这个问题 话说这个我没有什么经验,只能猜,惭愧。