67-套接字超时(select)
来源:互联网 发布:南宁智尚网络骗局 编辑:程序博客网 时间:2024/05/24 07:28
设置超时的第二个技术是使用 select 函数。它使用了 select 函数的最后一个超时参数,对套接字描述符进行了“预读”。
1. 程序路径
代码托管在 gitos 上,请使用下面的命令获取:
git clone https://git.oschina.net/ivan_allen/unp.git
如果你已经 clone 过这个代码了,请使用 Git pull 更新一下。本节程序所使用的程序路径是 unp/program/advcio/read_timeo/read_timeo_select
.
2. 伪代码
- 用于判断是否可读的函数
// 该函数利用 select 函数判断在 nsec 时间内描述符 fd 是否可读int readable_timeo(int fd, int nsec) { int ret; fd_set rfds; struct timeval tv; FD_ZERO(&rfds); FD_SET(fd, &rfds); tv.tv_sec = nsec; tv.tv_usec = 0; ret = select(fd + 1, &rfds, NULL, NULL, &tv); return ret;}
- 带超时的 recvfrom 函数
int recvfrom_timeo(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen, int nsec) { int ret; ret = readable_timeo(sockfd, nsec); // select 函数返回 0,表示超时 if (ret == 0) { errno = ETIMEDOUT; ret = -1; } else { ret = recvfrom(sockfd, buf, len, flags, src_addr, addrlen); } return ret;}
3. 实验结果
read_timeo_select 是一个 udp 客户端,实际上就是前面的 udp/basic 程序,只不过它将 recvfrom 修改成了带超时的 recvfrom.
read_timeo_select 向 mars 主机发送了一个报文后,阻塞在 recvfrom_timeo 函数上,因为 mars 主机上的服务器并未启动,因此 read_timeo_select 永远也不可能收到 mars 主机发回的数据。
经历 5 秒的时候后,recvfrom_timeo 函数超时返回。
图1 带超时的 recvfrom 函数
4. 总结
- 掌握使用 select 函数编写超时函数的方法
0 0
- 67-套接字超时(select)
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- linux网络编程之socket(十一):套接字I/O超时设置方法和用select实现超时
- 套接字IO超时设置方法和用select实现超时
- linux网络编程之套接字:套接字I/O超时设置方法和用select实现超时
- 客户端套接字(Socket)超时
- 客户端套接字(Socket)超时
- 客户端套接字(Socket)的超时
- 客户端套接字(Socket)的超时
- 66-套接字超时(alarm)
- 套接字超时设置
- UNIX网络编程——使用select 实现套接字I/O超时
- 套接字select模型
- 套接字select模型
- 套接字Select
- cordova Using this version of Cordova with older version of cordova-android is being de precated. C
- Opencv2.4.9 + vs2013单次配置和永久配置
- Spring容器初始化过程
- Zedboard---实验七秒计数
- 04-树5 Root of AVL Tree (25分)
- 67-套接字超时(select)
- ES6学习——集合(Collections):WeakMap 应用示例
- docker
- Java基础学习总结(101)——Junit5抢鲜看
- RecyclerView基础介绍
- php学习笔记一基本配置
- 存储之IP SAN(ISCSI)
- Bootstrap的目录结构
- 你真的会使用枚举么