c - 套接字没有等待预期的 10 秒

标签 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() 函数接收数据。因此,为了验证延迟是否可以,我使用了两个类型为 time_t 的变量 start 和 stop:

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() 函数...

最佳答案

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

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

因此,如果您希望 recv() 阻塞一段时间,请将套接字设置为阻塞像您一样应用超时。

关于c - 套接字没有等待预期的 10 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22686921/

相关文章:

linux - 确定 linux 系统 IP 接口(interface)上的平均传输速率

从 c 调用 fortran 函数时无法正确传递数组

c - Lex 和 Yacc 符号表生成和操作

c - 套接字编程将多个客户端连接到一台服务器并列出它们 C

linux - 如何使用 C++ 代码中的 setsockopt() 调用更改 TCP 拥塞控制算法

c - C中两个日期之间的秒数差异

c - 如何在 C 中分解 unix 时间

c - c中的时间戳,精度为毫秒

c - 读取未格式化文件的 Fortran 到 C 的翻译

c - 如何获取作为输入输入的数字的最小倍数,而不是输入的数字本身?