linux下socket connect 阻塞方式 阻塞时间控制

linux socket 非阻塞设置 int socket_open_connect_ip(const u8 *ip,const u32 port) {     int len =  0;     //int port= 6908;     int ret;     struct sockaddr_in addr;     if(ip!=NULL);          else         return -100;//no ... 阅读详情
同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间。应用的背景是:linux下的c程序有两个目标IP需要connect,如果用阻塞方式,当其中一个IP不能连接的情况下,程序将阻塞在connect函数上。
     本来以为用setsockopt修改个什么参数就可以搞定,结果baidu了半天也没有结果。倒是在网上搜到很多这样的解决方案:将connect方式设置为非阻塞方式,这样程序一旦执行就会马上返回,但问题是,到底有没有连接上呢,你需要等待一段时间,然后使用函数判断连接是否正常。试了下,貌似由于系统的区别,这个方法在我的linux环境下不适用,主要是后面判断是否连接上的函数不行,不管连接上或没连接上都返回一个值。
      看来网上的方法也不能尽信,最后在公司前人的一段代码里面找到了解决方法,这里分享下:

  1. sigset(SIGALRM, u_alarm_handler);
  2. alarm(2);
  3. code = connect(socket_fd, (struct sockaddr*)&socket_st, sizeof(struct sockaddr_in));
  4. alarm(0);
  5. sigrelse(SIGALRM);
     首先定义一个中断信号处理函数u_alarm_handler,用于超时后的报警处理,然后定义一个2秒的定时器,执行connect,当系统connect成功,则系统正常执行下去;如果connect不成功阻塞在这里,则超过定义的2秒后,系统会产生一个信号,触发执行u_alarm_handler函数, 当执行完u_alarm_handler后,程序将继续从connect的下面一行执行下去。
     其中,处理函数可以如下定义,也可以加入更多的错误处理。
    
  1. void u_alarm_handler()
  2. {
  3. }

     这个方法相对网上的做法而言代码量小,更精巧,看来老代码也是有很多值得学习的地方。

 

http://blog.chinaunix.net/space.php?uid=16792259&do=blog&id=3064785

 

C语言:通过alarm发送信号 alarm()函数用来在seconds秒之后安排发送一个SIGALRM信号,如果seconds为0,将取消所有已设置的闹钟请求。alarm()函数的返回值是以前设置的闹钟时间的余留秒数,如果返回失败返回-1。 阅读详情

相关推荐

【LinuxC语言】信号相关函数——kill、raise、pause与alarm

在Linux环境下,信号是一种重要的进程间通信机制,用于处理异步事件和控制进程行为。除了使用signal函数来设置信号处理函数外,还有一些其他的信号相关函数,如kill、raise、pause和alarm,它们提供了更多的信号处理和管理功能。本文将介绍这些函数的基本概念和用法,帮助读者更好地理解信号处理在Linux编程中的应用。这些函数看起来像是与操作系统或者编程语言相关的函数,让我假设你是在谈论编程。如果我错了,请告诉我。用于向指定的进程发送信号。pid:要发送信号的进程的 ID。sig。

m0_62599305的博客 1503

alarm

相关函数:signal, sleep 头文件:#include 定义函数:unsigned int alarm(unsigned int seconds); 函数说明:alarm()用来设置信号SIGALRM 在经过参数seconds 指定的秒数后传送给目前的进程. 如果参数seconds 为0, 则之前设置的闹钟会被取消, 并将剩下的时间返回. 返回值:返回之前闹钟的剩

码农崛起 807

Linux下多线程的阻塞模式下的socket编程

Linux下多线程的阻塞模式下的socket编程,简单实用,可以重用。

linux_设置定时器(C语言)-alarm函数-time命令-settimer函数

返回0或剩余的秒数,此时剩余的秒数是:距离第一次调用alarm函数后第二次调用alarm函数,上一次设定的seconds定时没有执行完的时间。假设你上一次定时5s,但是你的程序执行2s后又再次调用该函数,则本次调用的返回值就是上一次定时剩余的时间3s。③ 运行时计时(用户+内核):ITIMER_PROF → 27)SIGPROF 计算占用cpu及执行系统调用的时间。程序运行的瓶颈在于IO,优化程序,首选优化IO(标准输入输出屏幕)。常用:取消定时器alarm(0),返回旧闹钟余下秒数。

qq_44177918的博客 2355

Silvaco Atlas从头开始(四)——定义材料参数和模型

这部分是关于定义材料参数和模型。

qsz1425AWD2121的博客 4651

AD | Altium Designer(原理图设计、电路仿真、PCB绘图)汉化版

Altium Designer(原理图设计、电路仿真、PCB绘图)

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 4169

alarm()函数

alarm()用来设置信号SIGALRM在经过参数seconds指定的秒数后传送给目前的进程。定义函数:unsigned int alarm(unsigned int seconds);如果参数seconds为0,则之前设置的闹钟会取消,并将剩下的时间返回。返回值:返回之前闹钟的剩余秒数,如果之前未设置闹钟则返回0。头文件:#include相关函数:signal,sleep。

weixin_52018852的博客 237

游戏开发实战:如何在Unity中实现六边形网格地图(附完整代码)

本文详细介绍了在Unity中实现六边形网格地图的完整开发流程,从数学原理到实战代码。涵盖三种主流坐标系转换方法、距离计算算法对比、网格生成与渲染技巧,以及高级功能如网格高亮、寻路算法和性能优化策略。适合策略游戏、战棋类游戏开发者提升地图系统开发效率。

656

linux下socket connect阻塞方式 阻塞时间控制

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33699914的博客 424

大模型风电功率预测:短期,超短期,中长期的完整实现与代码详解

本文全面介绍了基于深度学习大模型的风电功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)三种时间尺度。文章详细阐述了数据准备与特征工程,包括数据收集、预处理和可视化分析。针对不同时间尺度,分别介绍了Temporal Fusion Transformer (TFT)、Informer和N-BEATS模型的构建、训练与评估方法,并提供了完整的开源代码实现。此外,文章还探讨了模型部署与生产环境集成,包括模型保存与加载、实时预测API以及模型监控与再训练。最后,文章总结了关键创新

专注AI大模型,软件混淆,授权 1892

OpenClaw实现多agent协作研究

本文介绍了如何构建多agent协作系统,通过飞书机器人实现任务分配与执行。系统包含三个agent:research_leader(总调度)、research_content(内容生成)和research_review(内容审核)。详细说明了agent配置方法(包括创建命令、权限设置)、飞书channel绑定方式,以及通过共享目录和会话机制实现协作。最后展示了应用示例,用户只需向leader机器人下达任务,系统即可自动完成内容生成和审核的全流程。

hhue2007的专栏 617

linux下socket connect 阻塞方式 阻塞时间控制(转)

     同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间。应用的背景是:linux下的c程序有两个目标IP需要connect,如果用阻塞方式,当其中一个IP不能连接的情况下,程序将阻塞在connect函数上。     本来以为用setsockopt修改个什么参数就可以搞定,结果baidu了半天也没有结果。倒是在网上搜到很多这样的解决方案:将connect方式设置为非...

igaozh的专栏 293

分布式计算Ray框架面试题及参考答案

动态任务图执行引擎是一种能够根据任务之间的依赖关系和运行时的实际情况,动态构建和执行任务图的系统。在 Ray 中,动态任务图执行引擎允许任务在运行时根据数据可用性、计算资源状态等因素,灵活地决定后续任务的执行顺序和方式。对于 AI 应用来说,其往往具有动态性的特点。例如,在深度学习模型的训练过程中,可能需要根据训练的结果动态调整下一轮训练的参数、数据增强方式或者模型结构。动态任务图执行引擎可以很好地支持这些动态需求。它能够根据 AI 应用中各个任务的实时输出和依赖关系,动态地生成和调整任务图。

大模型大数据攻城狮的专栏 1350

windows网络编程之socket中的非阻塞connect()与getsockopt()

在最近看的omap监控代码中有一段:     int error=-1, len;     len = sizeof(int);     timeval tm;     fd_set set;     unsigned long ul = 1;     ioctlsocket(mSocket, FIONBIO, &ul); //设置为非阻塞模式     bool ret

nocodelife的专栏 1万+

出现 Tomcat:HTTP状态 404 - 未找到解决方法(图文分析)

出现如下问题 HTTP状态 404 - 未找到 类型 状态报告 消息 请求的资源[/ajax_war_exploded/]不可用 描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。 Apache Tomcat/8.5.69 解决方法如下: 网上中的操作有步操作多数都误导 这个部署的环境目录上面是web.xml 下面的目录路径是web即可不用到webapp 保存重启服务器即可使用 其他配置中启动tomcat的操作具体 JRE 1.8 ...

码农研究僧的博客 13万+

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3231

linux_TCP_connect_阻塞处理

实现tcp client时阻塞在了tcp connect处,也与TCP 三次握手相关,问题记录在这里。

gavinpeng的专栏 1759

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

设置socket connect超时时间的几种方法

BSD内核:TCP_CONNECTIONTIMEOUT linux内核:TCP_SYNCNT

天道酬勤 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux-socket connect阻塞和非阻塞模式 示例

~/cpp$ ./connect 192.168.1.234 1234 kkkk block mode:  ubuntu 14.04 : time used:21.0.001053s connect 超时时间是大约21秒! 注意:如果connect 127.x.x.x  xxx  kkkk 会立即返回因为127开头的是网卡自身,你可以ping一下,发现都是通的,且等同于127.0.0.1 ...

weixin_33978044的博客 150

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Socket connect阻塞导致连接超时过长

在项目中,机械臂作为服务端,软件程序编写一个客户端进行连接,connect连接出现有异常时客户端线程阻塞时间过长;

heitong_fu的博客 3090

linux connect 超时时间,Linux下connect超时处理【总结】

1、前言最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口。当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口。我们知道端口属于网络的应用层,因此需要用ip和端口来探测,这个时候就可以用connect来探测一下,针对TCP协议,connect函数要进行TCP三次握手,如果connect成功,则说明服务器开放了某个端口,如果connect失败,...

weixin_28764661的博客 2525
上一篇: 在Linux中设置线程的优先级
下一篇: 报错 error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before
tinyhare
博客等级 码龄15年 11粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值