使用阻塞的socket, 可以设置读写超时,

struct timeval tv_timeout;
tv_timeout.tv_sec = 60;
tv_timeout.tv_usec = 0;
if (setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, (void *) &tv_timeout, sizeof(struct timeval)) < 0) {perror("setsockopt");
}
tv_timeout.tv_sec = 60;
tv_timeout.tv_usec = 0;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (void *) &tv_timeout, sizeof(struct timeval)) < 0) {perror("setsockopt");
}

但是这个不会影响connect.
如何设置connect超时呢, 通过信号alarm? 感觉不是一个好的办法.比较好的办法是通过select或者poll判断超时.
首先设置socket fd为非阻塞, connect判断返回值, 如果返回0, 说明connect成功, 如果返回值等于-1并且错误的errno为EINPROGRESS时调用select或者poll判断socket fd的可写状态, 通过select或者poll的超时设置来判断是否超时.
man page是这么写的

EINPROGRESS
The socket is non-blocking and the connection cannot be com-
pleted immediately. It is possible to select(2) or poll(2) for
completion by selecting the socket for writing. After select(2)
indicates writability, use getsockopt(2) to read the SO_ERROR
option at level SOL_SOCKET to determine whether connect() com-
pleted successfully (SO_ERROR is zero) or unsuccessfully
(SO_ERROR is one of the usual error codes listed here, explain-
ing the reason for the failure).

下边是示例代码:

int opt = 1;
//set non-blocking
if (ioctl(sockfd, FIONBIO, &opt) < 0) {close(sockfd);perror("ioctl");exit(0);
}if (connect(sockfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr)) == -1) {if (errno == EINPROGRESS) {int error;int len = sizeof(int);tv_timeout.tv_sec  = 60; tv_timeout.tv_usec = 0;FD_ZERO(&set);FD_SET(sockfd, &set);if(select(sockfd + 1, NULL, &set, NULL, &tv_timeout) > 0) {getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&len);if(error != 0) {close(sockfd);exit(0);}} else { //timeout or select errorclose(sockfd);exit(0);}} else {close(sockfd);perror("connect");exit(0);}
}opt = 0;
//set blocking
if (ioctl(sockfd, FIONBIO, &opt) < 0) {close(sockfd);perror("ioctl");exit(0);
}

C socket: 关于connect超时设置相关推荐

  1. 技术派-减少connect超时设置

    connect完成3次握手,非常耗时,怎么让connect减少超时等待引发的阻塞呢? 方法有:先设置为非阻塞,然后等待连接成功之后,重新设置回阻塞. #include <stdio.h> ...

  2. windows下设置socket的connect超时

    变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的: 1.建立socket 2.将该socket设置为非阻塞模式 3.调用connect() 4.使用select()检查该socke ...

  3. python3 socket 超时设置

    针对链接(connect)时候的超时: # 法一: import socketsocket.setdefaulttimeout(5) sock = socket.socket(socket.AF_IN ...

  4. Socket编程实践(9) --套接字IO超时设置方法

    引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) {return ; }signal(SIG ...

  5. php socket recv 超时,socket编程中的超时设置示例详解之一

    简介: 在网络通讯中,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题. 所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回. 在我们直接调用s ...

  6. socket 超时设置

    int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET, SO_SNDTIMEO, (char *)&nNetTimeout ...

  7. python socket connect 超时_python socket.connect – 为什么会超时?

    在这方面我很天真.我不确定为什么我的连接超时.提前致谢. #!/usr/bin/env python import socket def socket_to_me(): socket.setdefau ...

  8. linux设置send时间,[转]Socket 的send,recv在windows与linux下的超时设置

    从昨天到今天一真在搞这个网络断线检测的问题,一直没搞好,网上大多都说用ping 可以搞定,不过我就是搞不定,没办法之下想了个不是办法的办法,在 服务器上开了一个 UDP端口,监听数据,然后回发,不用T ...

  9. 远程主机关闭了一个现有连接python_python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054 | 学步园...

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

最新文章

  1. golang 并发与并行学习笔记(三)
  2. matlab gm 1 1,MATLAB 如何用GM(1,1)做预测?请大神帮忙!
  3. 卸任四家锤子公司法定代表人后:罗永浩退出聊天宝股东行列
  4. java8 elasticsearch_java – Elasticsearch – Junit测试(模拟或填...
  5. cnblog 闪存刷星星,每一条闪存都是星星
  6. [原] 计算机调试管理器服务被禁用的解决方法
  7. C-Free 5.0注册码
  8. 在乌班图系统上安装yum
  9. 【必收藏】PS常用快捷键大全
  10. html5在线画板菱形怎么画,HTML5 Canvas 制作一个“在线画板”
  11. 安装j2sdk以后,配置环境变量
  12. 2020年最新UI设计基础入门教程
  13. 金融工程学(五):互换概述
  14. 百度地图画扇形区域覆盖(大小方向颜色透明图可调)
  15. 保时捷卡宴Cayenne升级原厂360全景影像系统,行车更安全
  16. 小知识 - 恢复chmod执行权限
  17. Linux解压rar压缩文件的详细方法
  18. C语言指针强制类型转换
  19. 九龙证券|次新股叠加智慧交通+信创+数字经济概念,开盘冲涨停!
  20. python是什么?工作前景如何?怎么算有基础?爬数据违法嘛?。。

热门文章

  1. Canopy环境下pytesser库的安装配置
  2. 笔记本win10拨号上网报错720
  3. zabbix系列:解决The frontend does not match Zabbix database.
  4. 修改审查元素怎么保存_爱拍作者页所有视频怎么轻松保存,批量修改短视频md5?...
  5. 监控组态软件及其发展《转》
  6. 掘金量化如何精准选股?
  7. Ubuntu20.04LTS查看CUDA版本
  8. c语言字符是英文还是中文,c语言中判断中文还是英文字符
  9. Echart系列 | 绘制世界地图含中国各个省份(地图篇)(一)
  10. 关于usecase新建与构造配置