socket设置超时遇到的问题

sll568 sll568 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我使用了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?
...全文

相关推荐

评论 7
收藏 已收藏
分享
返回顶部
sll568
C语言 70,040 成员 243,237 内容