套接字不会等待预期的10秒

时间:2014-03-27 11:58:25

标签: c tcp time.h

在我的程序中,我正在使用time.h的 timeval 结构来获取TCP / IP套接字程序,其中客户端等待此结构值指定的超时值,结构初始化为以下

struct timeval tv; 
tv.tv_sec  = 10;  
tv.tv_usec = 0; 

并按原样设置套接字选项。由于recv()是一个阻止调用,我已经暂停了:

setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)) ;

并使用recv()函数接收数据。因此,为了验证延迟是否正常,我使用了两个变量start&停止类型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()函数......

2 个答案:

答案 0 :(得分:3)

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

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

因此,如果您希望recv()阻止一段时间,请将套接字设置为阻止按照您的方式应用超时。

答案 1 :(得分: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);