socket设置超时遇到的问题
我使用了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?