tcp/udp socket 网络通信中超时时间的设置

2023-10-29

1.connect函数的超时时间设置只对TCP有效 UDP由于是无连接的connect都会返回success

有两种方法:

第一种方法 默认的socket是阻塞模式 我们只需要设置其为非阻塞模式,然后调用select去查询其状态 代码如下: 

static int connect_server(char *ip, int port)
{
    int sockfd = -1;
    struct sockaddr_in servaddr;
    int flags = 0;

    if ((sockfd = socket(AF_INET, SOCK_STREAM , 0)) < 0)
    {
        printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
        return sockfd;
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    if (inet_pton(AF_INET, ip, &servaddr.sin_addr) <= 0)
    {
        printf("inet_pton error for %s\n", ip);
        close(sockfd);
        sockfd = -1;
        return sockfd;
    }

    //把链路设置为非阻塞
    flags = fcntl(sockfd, F_GETFL, 0);
    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
    
    if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    {
        if (errno != EINPROGRESS)       /* EINPROGRESS 表示连接正在建立的过程中 */
        {
            printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
            close(sockfd);
            sockfd = -1;
        }
        else
        {
            int ret;
            fd_set write_fds;
            struct timeval timeout;
            
            timeout.tv_sec = 0;
	        timeout.tv_usec = 100 * 1000;       /* 连接超时时长:100ms */

            FD_ZERO(&write_fds);
            FD_SET(sockfd, &write_fds);
  
            ret = select(sockfd + 1, NULL, &write_fds, NULL, &timeout);
            switch (ret)
            {
                case -1:        /* select错误 */
                {
                    printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
                    close(sockfd);
                    sockfd = -1;
                    break;
                }
                case 0:         /* 超时 */
                {
                    FK_TRACE_WARN("select timeout...\n");
                    close(sockfd);
                    sockfd = -1;
                    break;
                }
                default:
                {
                    int error = -1;
                    socklen_t optLen = sizeof(socklen_t);
                    
                    getsockopt(sockfd, SOL_SOCKET, SO_ERROR, (char *)&error, &optLen);       /* 通过 getsockopt 替代 FD_ISSET 判断是否连接 */
                    if (error != 0)
                    {
                        printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
                        close(sockfd);
                        sockfd = -1;
                    }
                    
                    break;
                }
            }
        }
    }

    return sockfd;
}

第二种是 默认其为阻塞模式  通过setsockopt 函数设置TCP_SYNCNT 值 头文件如下 

表示失败是tcp重连的次数 每次重连时间会翻倍 依次是 1 2 4 8 16 32 64 ....

1+2+4+8+16+32+64

实测发现 这个值是从0开始的  TCP_SYNCNT 值为2 那么 就是超时时间就是1+2+4 = 7秒

如果是3 就是1+2+4+8 = 15秒

#include <netinet/tcp.h>
#define TCP_SYNCNT 7

设置方法如下:

//Add tcp connect timeout processing
	printf("QMCY 20230113 add tcp connect time\n");
	int syncnt = 2; //1+2+4+8+16+32+64
	setsockopt(FDevSocket, IPPROTO_TCP, TCP_SYNCNT, &syncnt, sizeof(syncnt));

2.设置socket发送和接收超时时间 对TCP/UDP都有效

代码如下:

timeout.tv_sec =5;
	timeout.tv_usec = 0;

    if (setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) == -1) 
	{
		printf("setsockopt:%08x  SO_RCVTIMEO error is %d ",
			socket_fd,SOCKET_ERRNO());						
		goto ERROR;

    }

    if (setsockopt(socket_fd, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout)) == -1) 
	{
			printf("setsockopt:%08x  SO_SNDTIMEO error is %d ",
				socket_fd,SOCKET_ERRNO());						
			goto ERROR;
	}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tcp/udp socket 网络通信中超时时间的设置 的相关文章

  • 丢包纠错码 (UDP)

    我不知道要寻找什么 因为我从 纠错代码 中得到的只是与您不知道错误位置的情况相关的内容 因此 这些代码比我需要的要复杂得多 而且效率低下 在下文中 请注意位等于数据包 因为只有整个数据包可能会丢失 因此位类比非常适合 是否有 ECC 考虑到
  • 如何使用 ZeroMQ 处理原始 UDP?

    我有一个客户 我无法更改其代码 但我想使用 重新 编写ZeroMQ插座 客户使用原始TCP和原始的UDP插座 我知道我可以使用ZMQ ROUTER RAW对于生的TCP插座 但是原始的怎么样 UDP数据流 ZeroMQ 中对 UDP 的支持
  • Python-UDP客户端

    我目前正在阅读Pythonbook https www nostarch com blackhatpython并遇到了以下示例 import socket target host 127 0 0 1 target port 80 creat
  • 从 ANDROID 2.2 发送 UDP 包(HTC 希望)

    我有一个局域网 我想从我的 android htcdesire 发送一条 udp 消息到我的电脑 它们之间有一个 WLAN 路由器 问题是 UPD 消息永远不会到达 PC Android上的代码 package org example an
  • NTP请求包

    我试图弄清楚我需要在 NTP 请求包中发送 客户端 什么才能从服务器检索 NTP 包 我正在 Cortex M3 Stellaris LM3S6965 上使用 LWIP 据我了解 我将收到 UDP 标头 然后收到具有不同时间戳的 NTP 协
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • 如何在多个程序中接收相同的udp流?

    我有一个封闭的第三方系统 它发送单播 UDP 流 MPEG TS 我想在同一台计算机上的两个不同程序中访问该流 我无法更改源上的任何内容 甚至无法更改 IP 或端口 除了编写自己的小程序来捕获流然后创建新流并重新发送这两个流之外 还有其他选
  • 具有多个接口的 Python UDP 套接字

    我正在 Windows XP 机器上用 python2 7 编写脚本 本机使用不同的网卡连接到多个网络 我遇到了一个问题 我已将 UDP 套接字绑定到特定接口 我知道您可以通过仅提供网卡现有的 IP 地址来在 Windows 中完成此操作
  • 更改Windows下的默认套接字缓冲区大小[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我无法更改的应用程序正在丢弃一些传入的 UDP 数据包 我怀疑接收缓冲区溢出 是否有注册表设置可以使默认缓冲区大于 8KB From th
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • 搜索所有网络上的设备

    我想实现一个代码 通过它我可以列出网络上连接的 upnp 兼容媒体渲染器设备 我用谷歌搜索了这个并找到了以下代码扭曲的网站 https twistedmatrix com documents current core howto udp h
  • iOS 14 在进行本地网络广播时给出“操作系统错误:错误的文件描述符,errno = 9”

    做一点Jeopardy 风格问答 https stackoverflow blog 2011 07 01 its ok to ask and answer your own questions here 我正在 Flutter 中开发一个应
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • 致命错误:netinet/in.h:没有这样的文件或目录

    套接字编程 UDP 服务器 我正在尝试使用 UDP 服务器进行消息加密和解密 代码在这里 https www geeksforgeeks org message encryption decryption using udp server
  • C++ UDP Socket端口复用

    如何在 C 中创建客户端 UDP 套接字 以便它可以侦听另一个应用程序正在侦听的端口 换句话说 如何在 C 中应用端口复用 我只想监听一个端口 您可以使用嗅探器来做到这一点 只需忽略来自不同端口的数据包即可 我可能需要阻止它发送一些特定的数
  • Python UDP广播不发送

    我正在尝试从 Python 程序到两个 LabView 程序进行 UDP 广播 我似乎无法发送广播 我不确定我的套接字初始化错误在哪里 广播似乎足够简单 据我所知 其他电脑没有收到任何数据 另外 我将来还需要这个程序来接收来自其他电脑的数据
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对
  • 视频流上的 TCP 与 UDP

    我刚从网络编程考试回来 他们问我们的问题之一是 如果您要传输视频 您会使用 TCP 还是 UDP 请解释一下存储视频和实时视频流 对于这个问题 他们只是希望得到一个简短的答案 TCP 用于存储视频 UDP 用于实时视频 但我在回家的路上想到
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望

随机推荐

  • Vivado 使用过程中问题总结

    关注 星标公众号 及时获取更多技术分享 作者 冰茶奥利奥 微信公众号 嵌入式电子创客街 目录 情况1 在vivado进行一个行为级别仿真时 运行到simulate 步骤时 弹出了如下提示 情况2 综合时 ambiguous clock in
  • Bean name用法

    Spring的bean中有name属性 可以用来区分两个相同 部分属性不一样 的bean 最近我在做influxdb多数据源的时候用到 所以这里已influxdb为示例 仅供参考 看代码 Bean name influx1 public I
  • CSS媒体查询(@media)全面解析

    随着移动设备的快速普及 用户不再只是通过传统的电脑系来浏览 Web 内容 越来越多的用户开始使用各种尺寸的智能手机 平板电脑或者其它设备来浏览 Web 内容 为了确保使用不同设备的用户都能拥有不错的体验就需要用到媒体查询 媒体查询是 CSS
  • 【恒指早盘分析】趋势交易——看懂很简单,做到却很难!

    老子说 盖闻善执生者 陵行不辟兕虎 意思是说 善于保全生命的人 在山陵里走路不轻易干砍劈犀牛或老虎的事情 一个交易者不要轻易涉险 不要因欲望驱使而重仓或急于进场 也不要因为恐惧和疑虑而过早离场 老老实实的控制仓位 老老实实的看准行情之后再行
  • 【Flutter 1-15】Flutter手把手教程Dart语言——包管理工具Pub详解、pub get,pub cache使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me 什么是Pub工具 Dart 生态系统使用包来管理共享软件 比如 库和工具 我们使用Pub包管理工具 来获取Dart包 在Pub上 可以找到公开可用的包 或者从本地文件系统或其他的位置
  • Linux性能监控 -- top命令

    文章目录 示例 参数说明及操作 信息详解 系统运行信息 任务信息 cpu运行信息 内存 swap使用情况 进程消耗资源详情 示例 参数说明及操作 按cpu使用率排序 输入top后 再输入P 按内存使用率排序 输入top后 再输入M 信息详解
  • 关于 XCode ld: library not found for -lcurl clang的解决办法

    有时候项目在自己电脑上运行正常 通过svn提交项目 再checkout下来的时候 再次运行却报错 如 Xcode出现如下错误 一般是因为缺少相关 a等库文件 如 缺少libcurl a 打开 发现少了libcurl a 只需再将相关库文件添
  • Linux学习-17-rpm查询软件包命令(-q、-qa、-i、-p、-l、-f、-R)

    7 4 Linux rpm查询软件包命令 q qa i p l f R rpm 命令还可用来对 RPM 软件包做查询操作 具体包括 查询软件包是否已安装 查询系统中所有已安装的软件包 查看软件包的详细信息 查询软件包的文件列表 查询某系统文
  • JAVA编程基础:第九章 swing类

    如何创建更好看的界面 1 导入swing包 里面有更好看的组件 2 创建各个组件的实例 然后添加到面板 import java awt import javax swing swing包中的组件是从awt包扩展而来的 这些组件更好看 知识点
  • Linux下使用apt安装mysql

    Ubuntu上安装MySQL非常简单只需要几条命令就可以完成 1 sudo apt get install mysql server 2 apt get isntall mysql client 3 sudo apt get install
  • 如何快速制作数据词典

    其实制作数据词典是一件非常麻烦费力的事情 如果有一条SQL能够帮你全都查询出来 那无疑会省力许多 今天呢我就给大家带来一条这样的SQL 源自大佬小梦想的亲笔之作 USE information schema SELECT 字段 字段说明 P
  • Wireshark 使用技巧

    一 数据包过滤 过滤需要的IP地址 ip addr 在数据包过滤的基础上过滤协议ip addr xxx xxx xxx xxx and tcp 过滤端口ip addr xxx xxx xxx xxx and http and tcp por
  • PHPExcel 学习笔记

    首先到phpexcel官网上http phpexcel codeplex com下载最新的phpexcel类 下周解压缩一个classes文件夹 里面包含了PHPExcel php和PHPExcel的文件夹 这个类文件和文件夹是我们需要的
  • 自动控制原理《传递函数》

    目录 文章目录 目录 摘要 1 传递函数的定义 2 传递函数的标准形式 3 传递函数的性质 4 传递函数的局限性 5 总结 摘要 本节主要学习自动控制原理中的传递函数相关知识 大部分内容参考西北工业大学课件 1 传递函数的定义 需要注意的是
  • JEESITE快速开发平台(五)用户-角色-部门-区域-菜单-权限表关系

    一 表关系 一共有8张表分别用来实现用户 角色 部门 区域 菜单 权限管理 详细如下 二 SQL语句 java view plain copy 一共八张表 select from sys user 用户表 select from sys m
  • Vue 打包优化之 生产环境删除 console 日志

    使用 vue cli 3 0 vue cli 脚手架构建的项目 一般在本地开发过程中 会有不少 console 调试信息 如果不处理这些日志信息 默认情况下 即使是构建生产环境的包 这些 console 打印也不会被移除 这显然是不够严谨的
  • 蓝桥杯-时间模拟

    蓝桥杯 时间模拟 引言 时间模拟 是蓝桥杯最常见的题型 我愿意把他称作小白和入门画的界限 接下来就让我来带大家入门把 一 模板 include
  • 操作系统学习提升篇——进程同步

    进程的线程共享进程资源 进程共享计算机资源 因此进程和线程一样都需要信息同步 共享内存 在某种程度上 多进程是共同使用物理内存的 由于操作系统的进程管理 进程间的内存空间是独立的 进程默认是不能访问进程空间之外的内存空间的 一个进程不能访问
  • 在java项目中如何使用Lucene搜索引擎(入门篇)

    什么是lucene 就是一个简单的工具包 java语言特有的 做全文检索用的 为什么不用数据库的模糊查询 两者都什么区别 1 模糊查询只适用于结构化数据 如数据库中存储的数据 非结构化数据就是文档 图片 音频等等 2 模糊查询速度慢 3 不
  • tcp/udp socket 网络通信中超时时间的设置

    1 connect函数的超时时间设置只对TCP有效 UDP由于是无连接的connect都会返回success 有两种方法 第一种方法 默认的socket是阻塞模式 我们只需要设置其为非阻塞模式 然后调用select去查询其状态 代码如下 s