//read操作加上超时时间。
1 int read_timeout(int fd, void *buf, uint32_t count, int time)
{
if(time > ) {
fd_set rSet;
FD_ZERO(&rSet);
FD_SET(fd, &rSet); struct timeval timeout;
memset(&timeout, , sizeof(timeout));
timeout.tv_sec = time;
timeout.tv_usec = ; int ret;
while() {
ret = select(fd+, &rSet, NULL, NULL, &timeout);
if(ret < ) {
if(errno == EINTR) continue;
ERR_EXIT("select");
} else if(ret == ) {
errno = ETIMEDOUT;
return -;
} else {
break;
}
}
}
int readNum;
readNum = read(fd, buf, count);
return readNum;
}

写超时

 int write_timeout(int fd, void *buf, uint32_t count, int time)
{
if(time > ) {
fd_set wSet;
FD_ZERO(&wSet);
FD_SET(fd, &wSet); struct timeval timeout;
memset(&timeout, , sizeof(timeout));
timeout.tv_sec = time;
timeout.tv_usec = ; int ret;
while() {
ret = select(fd+, NULL, &wSet, NULL, &timeout);
if(ret < ) {
if(errno == EINTR) continue;
ERR_EXIT("select");
} else if(ret == ) {
errno = ETIMEDOUT;
return -;
} else {
break;
}
}
}
int writeNum;
writeNum = write(fd, buf, count);
return writeNum;
}

accept超时操作

int accept_timeout(int fd, struct sockaddrin *addr, socklen_t *addrlen, int time)
{
int ret;
if(time > ) {
fd_set rSet;
FD_ZERO(&rSet);
FD_SET(fd, &rSet); struct timeval timeout;
timeout.tv_sec = time;
timeout.tv_usec = ; int selectRet;
do {
selectRet = select(fd + , &rSet, NULL, NULL, &timeout);
}while(selectRet < && selectRet == EINTR);
if(selectRet < ) {
return -;
} else if(selectRet == ) {
errno = ETIMEDOUT;
return -;
}
}
if(addr) {
ret = accept(fd, (struct sockaddr *)addr, addrlen);
} else {
ret = accept(fd, NULL, NULL);
}
return ret;
}

检测监听套接字是否可读,当监听套接字可读的时候,就认为连接队列发生了连接。

connect

 void setNonBlockMode(int fd)
{
int flags = fcntl(fd, F_GETFL);
if(flags < ) {
ERR_EXIT("fcntl");
}
flags |= O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < ) {
ERR_EXIT("fcntl");
}
} void setBlockMode(int fd)
{
int flags = fcntl(fd, F_GETFL);
if(flags < ) {
ERR_EXIT("fcntl");
}
flags &= ~O_NONBLOCK;
if(fcntl(fd, F_SETFL, flags) < ) {
ERR_EXIT("fcntl");
} } int connect_timeout(int sockfd, struct sockaddrin *addr, socklen_t addrlen, int time)
{
int ret = -; if(time > ) {
setNonBlockMode(sockfd);
}
ret = connect(sockfd, (struct sockaddr*)addr, addrlen);
if(ret < && errno == EINPROGRESS) {
fd_set wSet;
FD_ZERO(&wSet);
FD_SET(sockfd, &wSet); struct timeval timeout;
timeout.tv_sec = time;
timeout.tv_usec = ; int selcetRet;
do{
selcetRet = select(sockfd + , NULL, &wSet, NULL, &timeout);
}while(selcetRet < && errno == EINTR);
if(selcetRet < ) {
ret = -;
} else if(selcetRet == ) {
ret = -;
errno = ETIMEDOUT;
} else if(selcetRet > ) {
int err;
socklen_t socklen = sizeof(err);
int sockoptRet = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &socklen);
if(sockoptRet == -) {
ret = -;
}
if(err == ) {
ret = ;
} else {
errno = err;
ret = -;
}
}
}
if(time > ) {
setBlockMode(sockfd);
}
return ret;
}

1.设置fd为非阻塞模式。

2.调用connect操作,如果网络条件很好,比如本机两个socket发生连接,会发生成功返回。

3.正常情况下,connect立即返回-1并设置errno为EINPROGRESS 表示正在连接过程中。

4.使用select检测fd是否可写。 如果检测到可写也有如下两种情况:

  1. connect连接成功。

  2. 产生了错误,我们就需要用getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &err, &socklen); 来判断是否发生了错误。

最新文章

  1. 关于settimeout 和for循环
  2. 2.7---判断链表是否是回文(CC150)
  3. NEC学习 ---- 布局 -三列, 左右定宽,中间自适应
  4. Java基础之读文件——使用输入流读取二进制文件(StreamInputFromFile)
  5. Spring+Struts+Ibatis的配置
  6. 【转】linux /usr/bin/ld cannot find 解决
  7. ios7 UIScrollView 尺寸问题
  8. Git学习 -- 冲突解决
  9. Rosenblatt感知器
  10. Android Multimedia框架总结(六)C++中MediaPlayer的C/S架构
  11. Django-website 程序案例系列-5 模态对话框实现提交数据
  12. CocosCreator 自定义TypeScript在VsCode的提示数据
  13. WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
  14. 【总结 】550,535,553 Mail from must equal authorized user— jenkins(hudson) email163邮箱和26邮箱成功配置总结
  15. 4. Beego 框架之cookie与session
  16. [hadoop]mapreduce原理简述
  17. Android图片压缩工具MCompressor
  18. 32Mybatis_mybatis逆向工程自动生成代码
  19. php中判断一个字符是否在字符串中
  20. PHP文档生成器(PHPDoc)的基本用法

热门文章

  1. vue2.0 vue-router
  2. java实验8-Java输入输出流
  3. javascript变量初始化位置
  4. shell脚本编写-自动部署及监控
  5. Node.js 数据存储方式的选择
  6. java 堆和栈一般理解
  7. 将Ubuntu主文件夹里的中文文件夹名称改成英文
  8. bitmap进行个数统计
  9. Nexus 5更新 Android5.0 失败解决方法
  10. 开源流媒体服务器EasyDarwin支持epoll网络模型,大大提升流媒体服务器网络并发性能