2014-03-27 32 views
1

在我的程序中,我正在使用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()函数...

+0

什么是全局'errno'设置为?你的套接字是否被阻塞?如果是这样,那就不会永远等下去。 'fcntl'会设置阻塞选项。 10秒的意义是什么? – Brian

+0

我的套接字是非阻塞的,这就是为什么我使用setsocketopt()函数,我想等待10秒的超时值,即;如果在10秒内没有收到数据,我必须退出recv()函数... – user3395801

+0

您可以使用'fcntl'设置阻塞选项。不'setsocketopt'。 https://stackoverflow.com/a/1549344/2591612 – Brian

回答

3

如果您的套接字是非阻塞的,即使您设置了超时,recv()也不会阻塞。

设置超时对于阻塞套接字是有意义的,不要让它们永远阻塞。

所以,如果你想recv()阻塞一段时间,将套接字设置为阻塞像你那样应用超时。

0

你的时间计算,是完全错误

clock()计算花费在大多数平台的CPU时间(WINDOWS是这里的除外)。阻塞和等待数据不会消耗大量的CPU时间。

此外,clock()返回一个clock_t,不是time_t,所以它传递给difftime()没有意义。 clock()也以CLOCKS_PER_SEC为单位,因此如果您想将时差转换为例如毫秒或秒。

作为一个开始,因为你的超时时间在几秒钟内,使用time()来计算它们花费的时间,结果将以秒为单位。如果您需要更细粒度的内容,请使用gettimeofday()

time_t start=time(); 
BytesRcvd = recv(sock, CacheBuffer1, sizeof(CacheBuffer1), FLAG); 
time_t stop=time(); 
time_t difference=difftime(stop,start); 
+0

我不需要在那一刻的确切时间,只是区别接收开始和接收结束的时间,因为clock()函数返回一个参考时间到某个值,我认为这可能是足够的 – user3395801

+0

@ user3395801嗯,它当然取决于平台,但它如何测量CPU什么时候你想检查超时值是否被打中?即时钟()可能会测量1微秒的CPU时间,即使您的呼叫阻塞2分钟。无论如何你需要关心CLOCKS_PER_SEC,所以你知道你输出的值是微秒,毫秒还是别的。 – nos