在我的程序中,我正在使用timeval TCP/IP套接字程序的time.h结构,其中客户端等待此结构值指定的超时值结构初始化如下套接字不等待预期的10秒
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
并按原样设置套接字选项。由于recv()是一个阻塞呼叫,我把超时:
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)) ;
并使用recv()函数接收数据。因此,为了验证延迟是否好,我用了两个变量开始&停止time_t类型的:
直到数据通过接收time_t start=clock();
BytesRcvd = recv(sock, CacheBuffer1, sizeof(CacheBuffer1), FLAG);
time_t stop=clock();
time_t difference=difftime(stop,start);
,从而按照定义我的期望是的recv()函数等待最多10秒插座。从服务器端我没有发送任何东西。但是在计算差值后,我得到的值是10,但我没有感觉到接收延迟10秒,但是在毫秒的范围内,所以我认为它只需要大约10 毫秒
什么可能是问题?有什么想法吗?
[从评论更新]
我的插座是无阻塞的,这就是为什么我用setsocketopt()函数,我要等待10秒,即超时值;如果在10秒内没有收到数据,我必须退出recv()函数...
什么是全局'errno'设置为?你的套接字是否被阻塞?如果是这样,那就不会永远等下去。 'fcntl'会设置阻塞选项。 10秒的意义是什么? – Brian
我的套接字是非阻塞的,这就是为什么我使用setsocketopt()函数,我想等待10秒的超时值,即;如果在10秒内没有收到数据,我必须退出recv()函数... – user3395801
您可以使用'fcntl'设置阻塞选项。不'setsocketopt'。 https://stackoverflow.com/a/1549344/2591612 – Brian