使用阻塞的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. PDMan-2.1.3 发布:用心开源,免费的国产数据库建模工具
  2. 使用 yo 命令行向导创建 SAP UI5 应用
  3. android自定义游戏闯关图,Android自定义View(四) -- Canvas
  4. HTTP 错误 404 - 文件或目录未找到 - 最终解决方法
  5. 新RSS reader
  6. Pl/SQL Developer 配置
  7. 《三国志》生僻人名读法集(zz)
  8. Vue中computed、methods和watch之间的区别
  9. Python-Flask构建微信小程序订餐系统-Flask打造高可用flask mvc框架-08
  10. ScriptProcessorNode
  11. tensorflow随笔——LeNet网络
  12. SHELL(bash)脚本编程四:其他扩展
  13. centos安装activitymq
  14. java初学者:封装 继承 多态的理解
  15. “互联网+”服务产业现状和个人信息保护特征分析
  16. SprutCAM v4.0.1.30 Expert Edition-ISO 1CD(完全版)
  17. python可以做什么灰产-广州市标书资料销毁详细流程
  18. stata domin
  19. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
  20. 【Python3.7】就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例

热门文章

  1. jmeter5.3下载地址及安装指南
  2. 利用Floyd-Steinberg方法(dithering),将灰度图转换为二值图
  3. SPSS处理多自变量多因变量分析以及描述平均值,在不同情况
  4. html视频试看代码,m3u8地址的预览与试看功能更能吸引用户
  5. Django 模板引擎以及模板
  6. 菜鸟教程之如何写出最基础的html
  7. 北京大学软件工程第二学位!全日制国家支持,不读研也有出路!
  8. 2022年(金融保险)金融行业几个比较热门的证书
  9. 软件研发的6sigma案例解析(转)
  10. linux运维管理之监控,Linux系统运维之运维监控.pdf