socket设置超时遇到的问题

sll568 2009-03-15 06:02:22
我使用了setsockopt设置超时,如下:
timeout = 20;//20ms
bread = setsockopt(sockRaw,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeout,sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set recv timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
timeout = 20; //20ms
bread = setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&timeout,sizeof(timeout));
if(bread == SOCKET_ERROR) {
fprintf(stderr,"failed to set send timeout: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
然后在sendto和recvfrom出打印运行时间,如下:
bwrote = sendto(sockRaw,icmp_data,datasize,0,(struct sockaddr*)&dest,sizeof(dest));
printf("Send tick = %d\n",GetTickCount());
if (bwrote == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.\n");
continue;
}
fprintf(stderr,"sendto failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}
if (bwrote < datasize ) {
fprintf(stdout,"Wrote %d bytes\n",bwrote);
}

printf("Middle tick = %d\n",GetTickCount());
bread = recvfrom(sockRaw,recvbuf,MAX_PACKET,0,(struct sockaddr*)&from,&fromlen);
printf("Recv timeout tick = %d\n",GetTickCount());
if (bread == SOCKET_ERROR){
if (WSAGetLastError() == WSAETIMEDOUT) {
printf("Request timed out.ms = %d\n",GetTickCount()-((IcmpHeader*)icmp_data)->timestamp);
continue;
}
fprintf(stderr,"recvfrom failed: %d\n",WSAGetLastError());
ExitProcess(STATUS_FAILED);
}

时间输出如下:
Send tick = 837359
Middle tick = 837359
Recv timeout tick = 837906
Request timed out.ms = 547

疑问是:为啥recvfrom不是在判断了20ms超时以后就打印信息,而是等了很长一段时间547-20ms以后,才执行下面的信息?难道recvfrom这个函数本身运行了500ms?
...全文
199 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
什么系统?linux下现在不流行select,都用epoll了。
Win下有个IOCP,楼主有兴趣可以看看。
sll568 2009-03-15
  • 打赏
  • 举报
回复
参考了一些其他的select的例子,发现自己对socket的了解还非常少,需呀学习的东西很多。
照猫画虎试验了以下代码,可以实现
//select
fd_set readfds;
struct timeval tv;
tv.tv_sec=0;//秒
tv.tv_usec=200 000;//微秒,也即200ms
FD_ZERO(&readfds);
FD_SET(sockRaw,&readfds);
select(0,&readfds,NULL,NULL,&tv);
if(FD_ISSET(sockRaw,&readfds))
{
printf("can recvfrom socket\n");
}
else
{
printf("time out!\n");
continue;
}

谢谢arong1234
lin_style 2009-03-15
  • 打赏
  • 举报
回复
ioctl?
arong1234 2009-03-15
  • 打赏
  • 举报
回复
而且你20ms也太狠了,网络响应哪那么快
arong1234 2009-03-15
  • 打赏
  • 举报
回复
没有任何办法直接通过api设置
唯一的办法是用select函数判断,select函数是可以设置超时的
找一些select函数的例子去学吧

[Quote=引用 3 楼 sll568 的回复:]
是windows下
我是看了前面有帖子是类似socket设置超时的,所以用的setsockopt
那么请教下应该怎样设置好呢?
谢谢
[/Quote]
sll568 2009-03-15
  • 打赏
  • 举报
回复
是windows下
我是看了前面有帖子是类似socket设置超时的,所以用的setsockopt
那么请教下应该怎样设置好呢?
谢谢
arong1234 2009-03-15
  • 打赏
  • 举报
回复
Windows下?发送接受超时是没有实现得,你这样得设置没有作用

69,369

社区成员

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

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