68-套接字超时(SO_RCVTIMEO 与 SO_SNDTIMEO)
2017-05-02 10:22
211 查看
设置套接字超时的第三个技术是使用套接字选项 SO_RCVTIMEO 与 SO_SNDTIMEO,它的优势在于一次设置,所有应用于该套接字的操作都自动带有超时时间。它就好像是一个全局开关。
比如对于 SO_RCVTIMEO 来说,如果设置了它,所有对该套接字的读操作在规定的时间里没完成,就直接返回并设置
比如对于 SO_RCVTIMEO 来说,如果设置了它,所有对该套接字的读操作在规定的时间里没完成,就直接返回并设置
errno = EWOULDBLOCK,对于 SO_SNDTIMEO 选项来说也是一样。
1. 程序路径
代码托管在 gitos 上,请使用下面的命令获取:git clone https://git.oschina.net/ivan_allen/unp.git[/code]
如果你已经 clone 过这个代码了,请使用git pull更新一下。本节程序所使用的程序路径是unp/program/advcio/read_timeo/read_timeo_sockopt.2. 设置 SO_RCVTIMEO
设置 SO_RCVTIMEO 超时sockfd = socket(/*...*/); // 设置超时时间为 5 秒 struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
经过一次性设置后,以后调用 read 系列的函数,最多只能阻塞 5 秒。对于 SO_SNDTIMEO 选项来说设置方法也是一样的。
recvfrom 判断超时
如果 recvfrom 返回 EWOULDBLOCK,说明超时。nr = recvfrom(sockfd, /*...*/); if (nr < 0) { if (errno == EWOULDBLOCK) { // 超时 } //... }3. 实验结果
图1 使用套接字选项设置套接字超时4. 总结
掌握使用套接字选项 SO_RCVTIMEO 与 SO_SNDTIMEO 控制套接字超时
相关文章推荐
- 带超时时间的sendto和recvfrom(用SO_SNDTIMEO和SO_RCVTIMEO搞起)
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- 使用socket option-SO_RCVTIMEO为recvfrom设置超时
- linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别
- SO_SNDTIMEO和SO_RCVTIMEO
- winsock下与linux下setsockopt(SO_SNDTIMEO,SO_RCVTIMEO)的区别
- linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别
- winsock下与linux下setsockopt(SO_SNDTIMEO,SO_RCVTIMEO)的区别
- linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别
- socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
- 详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
- setsockopt中SO_RCVTIMEO和SO_SNDTIMEO
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- Python Network Programming(5)---套接字超时时间
- SO_REUSEADDR 套接字选项应用实例
- SO_REUSEADDR 套接字选项作用
- 如何在套接字IO操作上设置超时机制
- 套接字选项 SO_REUSEADDR