C socket: 关于connect超时设置
使用阻塞的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超时设置相关推荐
- 技术派-减少connect超时设置
connect完成3次握手,非常耗时,怎么让connect减少超时等待引发的阻塞呢? 方法有:先设置为非阻塞,然后等待连接成功之后,重新设置回阻塞. #include <stdio.h> ...
- windows下设置socket的connect超时
变相的实现connect的超时,我要讲的就是这个方法,原理上是这样的: 1.建立socket 2.将该socket设置为非阻塞模式 3.调用connect() 4.使用select()检查该socke ...
- python3 socket 超时设置
针对链接(connect)时候的超时: # 法一: import socketsocket.setdefaulttimeout(5) sock = socket.socket(socket.AF_IN ...
- Socket编程实践(9) --套接字IO超时设置方法
引:超时设置3种方案 1. alarm超时设置方法 //代码实现: 这种方式较少用 void sigHandlerForSigAlrm(int signo) {return ; }signal(SIG ...
- php socket recv 超时,socket编程中的超时设置示例详解之一
简介: 在网络通讯中,如果socket处于阻塞模式运行时,就需要考虑处理socket操作超时的问题. 所谓阻塞模式,是指其完成指定的操作之前阻塞当前的进程或线程,直到操作有结果返回. 在我们直接调用s ...
- socket 超时设置
int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET, SO_SNDTIMEO, (char *)&nNetTimeout ...
- python socket connect 超时_python socket.connect – 为什么会超时?
在这方面我很天真.我不确定为什么我的连接超时.提前致谢. #!/usr/bin/env python import socket def socket_to_me(): socket.setdefau ...
- linux设置send时间,[转]Socket 的send,recv在windows与linux下的超时设置
从昨天到今天一真在搞这个网络断线检测的问题,一直没搞好,网上大多都说用ping 可以搞定,不过我就是搞不定,没办法之下想了个不是办法的办法,在 服务器上开了一个 UDP端口,监听数据,然后回发,不用T ...
- 远程主机关闭了一个现有连接python_python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054 | 学步园...
python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...
最新文章
- PDMan-2.1.3 发布:用心开源,免费的国产数据库建模工具
- 使用 yo 命令行向导创建 SAP UI5 应用
- android自定义游戏闯关图,Android自定义View(四) -- Canvas
- HTTP 错误 404 - 文件或目录未找到 - 最终解决方法
- 新RSS reader
- Pl/SQL Developer 配置
- 《三国志》生僻人名读法集(zz)
- Vue中computed、methods和watch之间的区别
- Python-Flask构建微信小程序订餐系统-Flask打造高可用flask mvc框架-08
- ScriptProcessorNode
- tensorflow随笔——LeNet网络
- SHELL(bash)脚本编程四:其他扩展
- centos安装activitymq
- java初学者:封装 继承 多态的理解
- “互联网+”服务产业现状和个人信息保护特征分析
- SprutCAM v4.0.1.30 Expert Edition-ISO 1CD(完全版)
- python可以做什么灰产-广州市标书资料销毁详细流程
- stata domin
- Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
- 【Python3.7】就餐人数:在为完成练习 9-1 而编写的程序中,添加一个名为 number_served 的属性,并将其默认值设置为 0。根据这个类创建一个名为 restaurant 的实例
热门文章
- jmeter5.3下载地址及安装指南
- 利用Floyd-Steinberg方法(dithering),将灰度图转换为二值图
- SPSS处理多自变量多因变量分析以及描述平均值,在不同情况
- html视频试看代码,m3u8地址的预览与试看功能更能吸引用户
- Django 模板引擎以及模板
- 菜鸟教程之如何写出最基础的html
- 北京大学软件工程第二学位!全日制国家支持,不读研也有出路!
- 2022年(金融保险)金融行业几个比较热门的证书
- 软件研发的6sigma案例解析(转)
- linux运维管理之监控,Linux系统运维之运维监控.pdf