菜鸟问个UDP问题? 本帖最后由 VisualEleven 于 2011-05-06 17:00:08 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是阻塞模式 默认就是阻塞recvfrom会一直等待可以通过设置recv超时bool bOK=TRUE;if(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(LPSTR)bOK,sizeof(bOK))!=0)return ERROR; 本帖最后由 VisualEleven 于 2011-05-06 17:02:16 编辑 使用非阻塞的RECV或是开线程RECV WSAData wsaData; if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) return ; SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(s==INVALID_SOCKET) return ; INT timeout=2000; if(setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(LPSTR)&timeout,sizeof(int))!=0) return ; SOCKADDR_IN addr; INT len=sizeof(addr); CHAR buf[128]=""; sockaddr_in local; local.sin_family=AF_INET; local.sin_addr.S_un.S_addr=inet_addr("192.168.1.101"); local.sin_port=htons(4567); if(bind(s,(sockaddr*)&local,sizeof(local))==SOCKET_ERROR) return ; DWORD dwtime=GetTickCount(); INT ret=recvfrom(s,buf,128,0,(sockaddr*)&addr,&len); if(ret==SOCKET_ERROR) ShowMessage(IntToStr(GetTickCount()-dwtime)); closesocket(s); WSACleanup(); UDP服务器的宗旨就是不管哪发来的,只管收,一般不判断发送端的地址是否正确~你说的“地址的服务端”是个啥意思?服务器的地址?那就是本机地址啊,怎么可能不存在若是发送端地址的话,UDP服务器根本不判断发送端地址,怎么可能出这种错~ setsockopt(..., SO_RCVTIMEO, ..);设置超时值 其实是sendto然后返回的……我问得有点简略…… vs2008与MFC深入浅出 [100分]LuaPlus在VS2005中如何编译? 多窗口显示 如何利用VC编写发邮件的程序 求清晰的《vc技术内幕(第四版)》中文版 显示对话框 请问用VC如何实现控制WIN2000关机? 如何提取字符串中得汉字字符? ◆->谁买了和看了《程序员大本营》,怎么样?内容充实吗?水分多吗? 为什么不行?关于WindowProc过程。 如何判断路径下是文件还文件夹 为什么我的Release版本总是连接错误?
recvfrom会一直等待
可以通过设置recv超时
bool bOK=TRUE;
if(setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(LPSTR)bOK,sizeof(bOK))!=0)
return ERROR;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
return ;
SOCKET s=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(s==INVALID_SOCKET)
return ;
INT timeout=2000;
if(setsockopt(s,SOL_SOCKET,SO_RCVTIMEO,(LPSTR)&timeout,sizeof(int))!=0)
return ;
SOCKADDR_IN addr;
INT len=sizeof(addr);
CHAR buf[128]=""; sockaddr_in local;
local.sin_family=AF_INET;
local.sin_addr.S_un.S_addr=inet_addr("192.168.1.101");
local.sin_port=htons(4567);
if(bind(s,(sockaddr*)&local,sizeof(local))==SOCKET_ERROR)
return ;
DWORD dwtime=GetTickCount();
INT ret=recvfrom(s,buf,128,0,(sockaddr*)&addr,&len);
if(ret==SOCKET_ERROR)
ShowMessage(IntToStr(GetTickCount()-dwtime));
closesocket(s);
WSACleanup();
若是发送端地址的话,UDP服务器根本不判断发送端地址,怎么可能出这种错~
其实是sendto然后返回的……我问得有点简略……