我的编程空间,编程开发者的网络收藏夹
学习永远不晚

TCP连接超时处理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

TCP连接超时处理

        在LINUX系统中,系统默认TCP建立连接超时时间为127秒。但是对于应用程序来说,这个超时时间太长了,不利于一些业务的处理。比如说我的应用想通过建立TCP连接来判断服务端程序是否在运行,或者网络是否通达,这时我不可能等127秒。那么应用程序如何实现TCP连接超时呢?

首先我们来看connect函数的帮助说明:

man connect
EINPROGRESS              The socket is non-blocking and the connection cannot be completed 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() completed successfully (SO_ERROR is zero) or unsuccessfully (SO_ERROR is one of the usual              error codes listed here, explaining the reason for the failure).

解释如下:

        首先设置socket描述符为非阻塞模式,然后调用connect建立连接,此时连接操作不会立即完成,会返回错误码EINPROGRESS。然后使用select或者epoll来监测socket的写事件,如果超时时间内没有写事件到达,说明连接超时。如果有写事件时,需要获取socket错误码,错误为0时表示连接成功,错误码不为0时表示连接失败。

下面我们按照帮助说明编写一个简单的客户端demo程序来实现连接超时,供大家参考:

#include#include#include#include#include#includeint main(int argc,char *argv[]){//设为非阻塞int sockfd = socket(AF_INET, SOCK_STREAM|SOCK_NONBLOCK, 0);    printf("sockfd: %d\n", sockfd);    struct sockaddr_in sin;    sin.sin_family = AF_INET;    sin.sin_port = htons(80);     sin.sin_addr.s_addr = inet_addr("192.168.1.2");    socklen_t socklen = sizeof(struct sockaddr);    int ret = connect(sockfd, (struct sockaddr*)&sin, socklen);    printf("connect ret: %d\n", ret);    if(ret != 0)    {if(errno == EINPROGRESS){fd_set writefds;FD_ZERO(&writefds);FD_SET(sockfd, &writefds);struct timeval stm;stm.tv_sec = 3;stm.tv_usec = 0;ret = select(sockfd+1, NULL, &writefds, NULL, &stm);printf("select ret: %d\n", ret);//没有写事件,表示连接超时//比如,对端不可达if(0 == ret){printf("connect time out\n");}//有一个写事件else if (1 == ret){if(FD_ISSET(sockfd, &writefds)){printf("fd is set\n");//连接成功时val为0//连接失败时val非0,比如对端没有绑定该端口,val返回111,连接拒绝int val;ret = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &val, &socklen);printf("getsockopt ret: %d\n", ret);printf("err code: %d, [%s]\n", val, strerror(val));}}}else{printf("%s\n", strerror(errno));}}close(sockfd);    return 0;}

来源地址:https://blog.csdn.net/dreamflyly/article/details/129580846

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

TCP连接超时处理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python连接MySQL时如何处理连接超时问题?(当Python连接MySQL出现超时,应如何解决?)

如何解决Python连接MySQL超时问题设置连接超时时间(connect_timeout)。调整MySQL配置(connect_timeout、wait_timeout)。使用连接池(MySQLConnectionPool)。使用异步I/O(asyncio.connect)。检查网络连接、服务器负载、驱动程序、虚拟内存等其他因素。
Python连接MySQL时如何处理连接超时问题?(当Python连接MySQL出现超时,应如何解决?)
2024-04-02

MyBatis怎么处理数据库连接超时和SQL执行超时

MyBatis本身并不直接处理数据库连接超时和SQL执行超时的问题。这些问题通常由连接池和数据库驱动程序来处理。数据库连接超时:在MyBatis中,通常会使用连接池来管理数据库连接。连接池会定期检查连接的有效性,如果连接长时间没有被使用,
MyBatis怎么处理数据库连接超时和SQL执行超时
2024-05-08

云服务器连接超时的处理方法

1.检查网络连接首先,您需要检查您的网络连接是否正常。确保您的计算机或设备与云服务器之间的网络连接稳定。您可以尝试通过访问其他网站或使用其他网络应用程序来验证您的网络连接是否正常工作。2.检查防火墙设置如果您的网络连接正常,但仍然遇到连接超时问题,那么可能是由于防火墙设置导致的。请确保您的防火墙允许与云服务器的通信。您
2023-10-27

使用nodejs怎么对tcp连接进行处理

今天就跟大家聊聊有关使用nodejs怎么对tcp连接进行处理,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。int uv_tcp_listen(uv_tcp_t* tcp, int b
2023-06-06

数据库连接超时java处理的两种方式

这篇文章主要介绍了数据库连接超时java处理的两种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-15

数据库连接超时java处理的方式有哪些

这篇文章主要讲解了“数据库连接超时java处理的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库连接超时java处理的方式有哪些”吧!数据库连接超时java处理的方式在测试一套
2023-07-06

DriverManager的连接超时getConnection

在使用`DriverManager.getConnection`方法时,可以设置连接超时时间。连接超时是指在尝试建立数据库连接时等待的最大时间。如果超过了指定的连接超时时间仍然无法建立连接,将会抛出一个`SQLException`。要设置连
2023-09-27

Nginx处理WebSocket连接时的连接池管理优化

Nginx在处理WebSocket连接时,可以通过连接池管理优化来提高性能和稳定性。以下是一些优化建议:1. 使用ngx_http_websocket_module模块Nginx本身支持WebSocket协议,通过ngx_http_we
Nginx处理WebSocket连接时的连接池管理优化
2024-10-19

连接云服务器超时

但是,在使用云计算时,由于云服务器的超时,可能会导致应用程序无法正常运行或者数据丢失。因此,对于一些应用程序,如Web应用程序和数据库应用程序,超时问题非常重要。那么,如何避免云服务器超时呢?下面是一些有用的建议:定期检查云服务器的配置:确保云服务器的配置是正确的,并且运行正常。可以通过检查日志文件或使用工具来查看云服
连接云服务器超时
2023-10-28

云服务器连接超时

云服务器连接超时是指云服务器无法顺利连接到指定的远程主机,这可能是因为网络连接出现问题导致的。以下是一些可能导致云服务器连接超时的原因和解决方法:网络连接超时:如果使用的是公共云服务或者使用了不同的网络连接,可以尝试重新启动云服务器,以使网络连接正常。重新启动过程可能会需要一定的时间,但不会很长。远程主机连接超时:如果使用的是公共云服务或者使用的是不同的远程主机,可以尝试检查远程主机的连
2023-10-26

TCP的连接管理的“三次握手”

 TCP是面向连接的协议,TCP把连接作为最基本的抽象。每一条TCP连接唯一地被通信两端的两个端点所确定。在面向连接通信中,连接的建立和释放是必不可少的过程。TCP连接的建立采用客户服务器方式,主动发起连接建立的应用进程叫做客户,而被动等待连接的应用进程叫做服务器。而本文小编主要为大家介绍TCP的连接管理原理!  TC
TCP的连接管理的“三次握手”
2024-04-18

NamedpipeClientStream无法连接,保持超时

当 `NamedPipeClientStream` 无法连接到命名管道时,可能会出现以下几种情况:1. 管道名称错误:请确保在客户端代码中使用的管道名称与服务器端代码中创建的管道名称完全相同。管道名称是大小写敏感的。2. 服务器未启动:在客
2023-09-17

PHP连接超时时间如何设置

本篇内容主要讲解“PHP连接超时时间如何设置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP连接超时时间如何设置”吧!连接超时时间是指当我们进行网络请求时,如果服务器无法响应请求,那么客户端
2023-07-05

oracle连接超时怎么解决

oracle 连接超时问题最常见的原因是网络连接问题或数据库服务器响应缓慢。网络连接问题包括:检查网络连接。调整网络设置。增加连接超时值。数据库服务器响应缓慢问题包括:检查数据库负载。调整服务器资源。优化查询。如何解决 Oracle 连接超
oracle连接超时怎么解决
2024-05-21

jdbc怎么设置连接超时时间

在JDBC中,可以使用`java.sql.Statement`或`java.sql.Connection`对象的`setQueryTimeout`方法来设置连接超时时间。使用`Statement`对象的`setQueryTimeout`方法
2023-10-27

处理 mongodb 连接时的上下文

编程网今天将给大家带来《处理 mongodb 连接时的上下文》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮助到大家!问题内容我
处理 mongodb 连接时的上下文
2024-04-04

编程热搜

目录