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?
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?
...全文
相关推荐
PHP中Socket连接及读写数据超时问题分析
主要介绍了PHP中Socket连接及读写数据超时问题,分析了Socket连接的相关设置与使用技巧,需要的朋友可以参考下
windows下设置socket的connect超时
变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的: 1.建立socket 2.将该socket设置为非阻塞模式 3.调用connect() 4.使用select()检查该socket描述符是否可写(注意,是可写) 5.根据select()返回的结果判断connect()结果 6.将socket设置为阻塞模式(如果你的程序不需要用阻塞模式的,这步就省了,不过一般情况下都是用阻塞模式的,这样也容易管理)
Socket接受数据超时
Socket接受数据超时,采用Callable 接口实现
socket连接超时例程.rar
socket连接超时例程.rar
c#socket连接池和连接超时时间设置
提供一个c# socket连接池设计的例子,解决socket并发连接限制的问题,并且提供一种设置连接超时时间的方法,默认连接超时时间是不能设置的,提供了socket网络发送数据的接口.可用于pos小票打印机通讯。


