windows编程环境中设置UDP超时

LitteGreen 2010-08-31 11:02:59
接收UDP数据时,如果没有接收数据,recvfrom函数会一直等待中,造成线程假死,在网上找了很多设置超时的资料,都不是我想要的,所以在这里求助大家了,分不多了,请大家多帮帮忙,嘿嘿,我把我的代码贴出,看一下如何设置

class UDPNet
{
private:
WORD wVersionRequested;
WSADATA wsaData;
int err;
SOCKADDR_IN addrSrv;
SOCKADDR_IN addrClient;
SOCKET sockSrv;
int len,RecvLen;
public:
void Open(int SendPort,int RecvPort);
void Send(TCHAR Buffer[200],int SendLen);
int Recv(TCHAR Recv[200]);
void Close();
};
void UDPNet::Open(int SendPort,int RecvPort)
{
wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
MessageBox(NULL,"网络协议加载失败","",0);
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
MessageBox(NULL,"网络协议加载失败","",0);
}

sockSrv=socket(AF_INET,SOCK_DGRAM,0);//使用套接字
len=sizeof(SOCKADDR);
sockSrv=socket(AF_INET,SOCK_DGRAM,0);

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(RecvPort);

addrClient.sin_addr.S_un.S_addr=inet_addr("192.168.1.105");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(SendPort);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

};

void UDPNet::Send(TCHAR Buffer[],int SendLen)
{
sendto(sockSrv,Buffer,SendLen,0,(SOCKADDR*)&addrClient,
sizeof(SOCKADDR));
};
int UDPNet::Recv(TCHAR Recv[])
{
RecvLen=recvfrom(sockSrv,Recv,256,0,(SOCKADDR*)&addrSrv,&len);
return RecvLen;
};

void UDPNet::Close()
{
closesocket(sockSrv);
WSACleanup();
};
...全文
455 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2010-09-01
  • 打赏
  • 举报
回复
用多线程实现
justkk 2010-09-01
  • 打赏
  • 举报
回复
在recvfrom之前,用select()检测sockSrv是否可读.
处处留心 2010-09-01
  • 打赏
  • 举报
回复
对协议不懂,帮顶下!
xtaddqqug 2010-09-01
  • 打赏
  • 举报
回复
您具体想实现什么,如果仅是想线程能优雅的退出,closesocket(sockSrv);RecvLen=recvfrom(sockSrv,Recv,256,0,(SOCKADDR*)&addrSrv,&len);RecvLen就行了
ayw215 2010-08-31
  • 打赏
  • 举报
回复
1,换成非阻塞的
2,在套接字上设置SO_RCVTIMEO和SO_SNDTIMEO选项
3, 自己做个定时器统计下

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧