使用socket选项SO_RCVTIMEO和SO_SNDTIMEO设置超时时间

2023-10-28

socket选项SO_RCVTIMEOSO_SNDTIMEO,他们分别 用来设置socket接受 / 发送数据超时时间。
因此,这两个选项仅对数据接收和发送相关的socket专用系统调用有效(sendsendmsgrecvrecvmsgacceptconnect

在程序中,我们可以根据系统调用的返回值以及errno来判断超时时间是否已到,进而决定是否开始处理定时任务。

下例为设置connect超时时间:

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

// 超时连接函数
int timeout_connect(const char* ip, int port, int time) {
    int ret = 0;
    struct sockaddr_in address;
    bzero(&address, sizeof(address));
    address.sin_family = AF_INET;
    inet_pton(AF_INET, ip, &address.sin_addr);
    address.sin_port = htons(port);

    int sockfd = socket(PF_INET, SOCK_STREAM, 0);
    assert(sockfd >= 0);

    // 通过选项SO_RCVTIMEO和SO_ENDTIMEO所设置的超时事件类型是timeval,
    // 这和select系统调用的超时时间参数类型相同
    struct timeval timeout;
    timeout.tv_sec = time;
    timeout.tv_usec = 0;
    socklen_t len = sizeof(timeout);
    ret = setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, len);
    assert(ret != -1);

    ret = connect(sockfd, (struct sockaddr*)&address, sizeof(address));
    if (ret == -1) {
        // 超时对应的错误号是EINPROGRESS。
        // 下面这个条件如果成立,我们就可以处理定时任务了
        if (errno == EINPROGRESS) {
            printf("connection timeout, process timeout logic\n");
            return -1;
        }
        printf("error occur when connecting to server\n");
        return -1;
    }
    return sockfd;
}

int main(int argc, char* argv[]) {
    if (argc <= 2) {
        printf("usage: %s ip_address port_number\n", basename(argv[0]));
        return 1;
    }
    const char* ip = argv[1];
    int port = atoi(argv[2]);

    int sockfd = timeout_connect(ip, port, 10);
    if (sockfd < 0) {
        return 1;
    }
    return 0;
}

【注】
timeval

struct timeval {
     time_t       tv_sec;   
     suseconds_t  tv_usec;
};

其中tv_sec为时间的秒部分,tv_usec为时间的毫秒部分。

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

使用socket选项SO_RCVTIMEO和SO_SNDTIMEO设置超时时间 的相关文章

  • js点击按钮改变文本

    h1 My Web Page h1 p A Paragraph p
  • linux环境下搭建宝塔(一键部署)

    了解宝塔 简单好用的服务器运维面板 宝塔Linux面板是提升运维效率的服务器管理软件 支持一键LAMP LNMP 集群 监控 网站 FTP 数据库 JAVA等100多项服务器管理功能 有30个人的专业团队研发及维护 经过200多个版本的迭代
  • Spring Boot 最核心的 25 个注解

    Spring Boot 最核心的 25 个注解 1 SpringBootApplication 这是 Spring Boot 最最最核心的注解 用在 Spring Boot 主类上 标识这是一个 Spring Boot 应用 用来开启 Sp
  • h5事件监听

    问题 点击div 或弹框 外的任何区域div 或弹框 消失 前情提要 项目是用angular写的移动端页面 测试反馈点击确认按钮每次都要点击2次才生效 体验很不好 需要优化 页面如下图所示 点击金额输入框键盘出现输入金额 键盘是单独封装的组
  • vi编辑器的使用(1)

    Linux 系统下的文本编辑器有很多种 包括图形模式下的gedit kwrite等 文本模式下的vi vim vi的增强版本 emacs等 其中vi和emacs是Linux系统中最常用的两个编辑器 本节主要介绍vi编辑器 主要内容包括 vi
  • Qt事件(消息)循环的源码分析之创建

    Qt程序的特点 Qt 是事件驱动的 尤其是你用Qt做界面开发时 你必须知道Qt的事件循环是如何开展的 从Win32到Qt 程序入口WinMain 创建窗口 进入事件 消息 循环 int main int argc char argv 入口m
  • Java常用日期工具实现

    获取今日日期 获取本月第一天日期 获取本月最后一天日期 date转日期字符串 日期字符串转date 日期字符串格式化 根据date获取past天前的日期 获取当前年周数 yyyy w 获取范围时间内的日期集合 public class My
  • 第八届蓝桥杯JavaB组省赛I题----分巧克力

    儿童节那天有K位小朋友到小明家做客 小明拿出了珍藏的巧克力招待小朋友们 小明一共有N块巧克力 其中第i块是Hi x Wi的方格组成的长方形 为了公平起见 小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们 切出的巧克力需要满足 形状是正
  • 建模杂谈系列225 小结与反思

    说明 一个项目结束了 趁这两三天在休息 把本次的收获和教训都盘点一下 然后再开始一个更刺激的项目 短暂的停顿 是为了把过去一段时间辛苦的成果固化一下 把那些很容易消散的宝贵知识和经验可以给未来做决策工具 内容 1 事实 这是在疫情之后做的第
  • Vue3——Suspense组件

    Suspense组件 官网中有提到他是属于实验性功能
  • 面试知识点-- 操作系统执行可执行程序时,内存分配是怎样的?

    可执行程序的内存分布 GNU编译器生成的目标文件默认格式为elf executive linked file 格式 这是Linux系统所采用的可执行链接文件的通用文件格式 elf格式由若干个段 section 组成 由标准c源代码生成的目标
  • Java遍历List四种方法的效率对比

    Java遍历List四种方法的效率对比 遍历方法简介 Java遍历List的方法主要有 1 for each for bject o list 2 Iterator Iterator iter list iterator while ite
  • Linux配置、安装交叉编译环境 gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz

    步骤测试流程 步骤 1 将文件 gcc 4 6 2 glibc 2 13 linaro multilib 2011 12 tar gz 拷贝到 Ubuntu 主目录下 i MX6 用户光盘 i MX6 用户光盘 A linux tool g
  • 【Keras】LSTM和Bi-LSTM神经网络

    KerasLSTM和Bi LSTM神经网络 导入安装包 加载并划分数据集 数据处理 创建LSTM模型并训练 评估模型 创建Bi LSTM模型并训练 打印Bi LSTM模型 评估Bi LSTM模型 导入安装包 import tensorflo
  • FPGA资源之LUT

    文章目录 一 CLB资源简介 二 LUT查找表资源 SLICEM SLICEL 三 LUT资源 3 1 LUT资源工作原理 3 2 LUT资源内部结构 3 3 LUT功能的拓展 3 4 LUT硬件原语 一 CLB资源简介 Xilinx 7的
  • llvm 文件后缀转换

    emit llvm 生成和 llvm 相关的代码 S ll 可读文件 c 二进制文件 s 汇编代码 参考 http www aosabook org en llvm html http llvm org docs WritingAnLLVM
  • Android--通知之Notification

    前言 之前一篇博客讲了Android下使用Toast的方式提示消息 这篇博客讲解一下在Android中使用Notification提示消息给用户 Notification是一种具有全局效果的通知 程序一般通过NotificationMana
  • 【Proteus仿真】【51单片机】水箱液位检测控制装置设计

    文章目录 一 主要功能 二 硬件资源 三 软件设计 四 实验现象 联系作者 一 主要功能 1 压力液位检测 2 阈值设定 超限报警 3 压力液位显示 4 补排水自动控制 二 硬件资源 1 51单片机核心模块 2 PCF8591 AD DA模
  • 2023 ciscn国赛pwn lojin wp

    第一次参加国赛 被队友带飞了 pwn只做出来了四个 1381分 第16名 总体来说还可以 在所有题目中 也是拿到了pwn题login的一血 话说回来 来详细说一下 这个pwn题的解法 首先就是能看到这是个没附件的pwn题 说明只能通过交互去
  • python后端学习(十四)元类、ORM

    目录 元类 1 类也是对象 2 动态地创建类 3 使用type创建类 4 使用type创建带有属性的类 5 使用type创建带有方法的类 6 到底什么是元类 终于到主题了 7 metaclass 属性 8 自定义元类 ORM 1 ORM是什

随机推荐

  • Windows10系统下TensorFlow的安装教程

    前提条件 已经成功安装CUDA和cuDNN 以及Anconda软件 1 打开Anaconda Prompt 开始 gt Anaconda3 64 bit gt Anaconda Prompt anaconda3 2 查看conda版本 co
  • 腾讯程序员吐槽:1kw房产+1kw股票+300w现金,35岁准备退休

    前言 最近 在某互联网职场论坛 一位腾讯程序员发帖凡尔赛式的吐槽 35岁 已经准备好退休了 走之前给年轻人一个参考 到我这个年纪在大厂确实可能会碰到职业发展瓶颈 但并不意味着你们一毕业就去国企公务员是更好的选择 我不是被辞退 也不是离职就找
  • FTP可以登录但是不能使用被动模式上传文件

    原因 lsmod grep ftp 发现模块 ip nat ftp 被卸载导致被动模式无效 解决 在服务器上执行 modprobe ip conntrack ftp
  • 【Seq2Seq】使用神经网络进行序列到序列学习

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • jenkins的安装和配置(flask结合jenkins半自动化部署流程)

    jenkins在虚拟机中安装 1 1 背景介绍 Jenkins 是一款流行的开源持续集成 Continuous Integration 工具 广泛用于项目开发 具有自动化构建 测试和部署等功能 Jenkins官网 Jenkins Jenki
  • 解读工业互联网建设中的安全保障

    2017 11 27日 国务院发布关于深化 互联网 先进制造业 发展工业互联网的指导意见的政策文件 指导意见中用基本形势 总体要求 主要任务 保障支撑四个章节全面阐述了先进制造业融入互联网发展的新工业革命的历史契机 是把互联网信息技术融入到
  • Kubernetes系列之kubeadm部署多节点master集群

    版本信息 linux Centos7 kubernetes v1 14 5 docker v18 06 1 ce 节点信息 VIP 47 110 19 11 阿里云负载均衡 安装前准备 开始部署前确保所有节点网络正常 能访问公网 主要操作都
  • Qt Qt5NetWork.lib Qthttp的get、post请求都无法响应解决方法(丧心病狂)

    qt项目中 get post请求都无法响应 抓包发现也并没有发出请求 程序也编写通过 什么原因就是找不到 最终发现 在新建Qt Gui application的时候 如果后续要做post和get请求 一定要选上NetWork NetWork
  • unity学习日记:如何在手机上实现第三人称视角

    在手机上实现第三人称视角与在电脑上并无太大区别 只不过需要检测屏幕触碰以及滑动等问题 大体思路就是 在每一帧的开头 将Camera放到target的位置上等待进行旋转 获取到每一帧手指滑动的位移值 再按照位移值进行相应的旋转 最后Camer
  • 实机安装kalilinux和windows双系统(有图详细介绍)

    我选择的u盘制作工具是universal USB install 选择最上边第一步系统 选择kalilinux 选择你的镜像位置 然后第三步选择你要用的u盘 然后按create 然后选是等待解压完成 然后进入你电脑管理分出来磁盘空间30g以
  • win10中 微软 输入法 简体字 与 繁体字 设定 切换

    前言 不知道按了什么快捷键 输入的文字都变成了繁体字效果 快捷键 ctrl shift f 设定方法如下 一步一步设定 2 3 4 5 6 7 8 9 10
  • Python——pymysql + DBUtils实现数据库连接池及数据批量读写

    文章目录 1 安装pymysql DBUtils 2 创建数据库连接池 3 读MySQL 1 只读一行 2 批量读取 4 写入MySQL 1 安装pymysql DBUtils pip3 install i https pypi tuna
  • Unity2019+ 版本JDK配置常见问题

    在之前那篇Vuforia的配置中 安卓环境的配置是没问题的 而有人反馈说JDK配置有问题 后面我挨个排查了问题 结合网上已有的问题 整理出这篇分享给大家 1 明明安装了对应Unity版本模块包却依然提示找不到OpenJDK 如图1 2 图1
  • Java:正则表达式工具的使用

    概述 在java中 提供了一些跟正则表达式有关的工具类 例如String Pattern Matcher PatternSyntaxException等等 可以进行丰富的与正则表达式有关的操作 本文便依据功能分类来对这些功能的使用进行详细讲
  • 网站延迟加载图像有哪些方法?

    加载图像时 网站可能遇到延迟的问题 以下是一些可以减少图像加载延迟的方法 1 图像优化 优化图像大小和格式是减少加载延迟的关键 可以使用图像编辑工具来压缩图像 减小文件大小 同时保持可接受的质量 另外 使用适当的图像格式 如JPEG PNG
  • Linux API函数大全

    获取当前执行路径 getcwd 1 API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资
  • “930大促”日活增速超40% ,哈啰如何用预案高效应急?

    一分钟精华速览 应急预案 是指在系统出现故障时 为了保障核心业务能够持续可用 而提前准备的指导手册 这个手册可以用来告诉我们 在遇到什么样的问题后 做什么样的操作能最大化地降低对业务的影响 将被动响应变为主动防御 哈啰结合 930大促 活动
  • matlab练习程序(二值图像连通区域标记法,一步法)

    这个只需要遍历一次图像就能够完全标记了 我主要参考了WIKI和这位兄弟的博客 这两个把原理基本上该介绍的都介绍过了 我也不多说什么了 一步法代码相比两步法真是清晰又好看 似乎真的比两步法要好很多 代码如下 clear all close a
  • maven更改镜像路径为阿里镜像

    maven仓库默认在国外 使用难免很慢 尤其是下载依赖的时候 换为国内镜像 下载速度会变快很多 国内支持maven镜像的有阿里云 开源中国等 这里换为阿里云的 maven每更新一次镜像地址 都会重新下载一次包 修改方法 修改maven根目录
  • 使用socket选项SO_RCVTIMEO和SO_SNDTIMEO设置超时时间

    socket选项SO RCVTIMEO和SO SNDTIMEO 他们分别 用来设置socket接受 发送数据超时时间 因此 这两个选项仅对数据接收和发送相关的socket专用系统调用有效 send sendmsg recv recvmsg