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