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

Open Interpreter利用Code Interpreter实现本地化

作为一个可以在本地环境中运行的工具,Open Interpreter可以访问互联网,没有文件大小和运行时间的限制,并且可以利用任何包或库。去年7月,OpenAI发布了一个强大的插件,名为Code Interpreter(代码解释器),它可以根据用户的自然语言需求生成并执行代码解决方案,帮助完成各种任务,如数据分析、图表创建和文件编辑等。Open Interpreter不仅是一个编码解释器,它还是一个强大的工具,专注于处理复杂任务,将GPT-4代码解释器的强大功能与本地开发环境的灵活性完美结合在一起。

DigitalChina_DCG的博客 1794

coreldraw sp2精简版 x4_CorelDRAW X4下载-CorelDRAW X4 SP2 精简版_Win10镜像官网

CorelDRAW X4 SP2是一个专业图形设计软件,专用于矢量图形编辑与排版,借助其丰富的内容和专业图形设计、照片编辑和网站设计软件,您将能够随心所欲地表达自己的风格与创意,轻松创作徽标标志、广告标牌、车身贴和传单、模型绘制、插图描画、排版及分色输出等。CorelDRAW X4 SP2软件特色CorelDraw X4 相比两年前的 CorelDraw X3 加入了大量新特性,总计有50项以上,...

weixin_30346025的博客 8904

alarm()函数

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

weixin_52018852的博客 237

【微信小程序】微信小程序开发环境搭建:安装微信小程序开发者工具

通过本文的介绍,你应该已经成功安装并配置了微信小程序开发者工具,为微信小程序开发做好了准备。接下来,你可以开始编写你的第一个小程序项目,探索更多有趣的功能和特性。祝你开发顺利,创造更多优秀的作品!

墨夶的博客 2953

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

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

weixin_33699914的博客 424

【超详细】计算机操作系统总结及思维导图(汤子瀛版)

计算机操作系统 一.操作系统引论 1.操作系统的目标和功能 目标 方便性 有效性 提高系统资源利用率 提高系统吞吐量 可扩充性 开放性 作用 OS作为用户与计算机硬件系统之间的接口 命令方式 系统调用方式 图标–窗口方式 OS实现了对计算机资源的抽象 2.操作系统的发展过程 未配置操作系统的计算机系统 人工操作方式 用户独占全机 CPU等待人工操作 严重降低...

圣三一 2万+

ADS基础教程12 - 参数扫描

在硬件设计、仿真以及调试阶段,很多时候需要找到一个合理的参数来使设计处于最优状态。前面所讲的调优方式是其中的最直接的手段。因此,本文将介绍ADS中如何指定元器件的参数为变量,并可以对变量设置相应的约束条件,来实现的变量进行多组参数的仿真结果的展示。在图形显示界面,添加一个Plot,并添加参数结果。此时,结果中会显示出所有的扫描结果。参数扫描的要素包含:新建变量、变量参数设置、扫描模型设置三个方面。如果找不到该图标,在菜单栏单击右键,弹出的对话框将。,弹出的选项卡中,将添加两个变量。点击菜单栏的仿真按钮。

XZ_ZC的博客 8161

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

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

igaozh的专栏 293

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

【WRF-Chem第二期】WRF-Chem有关 namelist 详解

WW、forever的博客 2157

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万+

【明道云】如何让用户可以新增但不能修改记录

在设计表单时直接将字段设置只读是不行的。字段设置只读将会直接让界面上此字段的前端组件不可编辑。

每日出拳老爷子的博客 701

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4541

linux_TCP_connect_阻塞处理

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

gavinpeng的专栏 1759

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

BSD内核:TCP_CONNECTIONTIMEOUT linux内核:TCP_SYNCNT

天道酬勤 2万+

OV9734 DATASHEET,完整规格书

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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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、付费专栏及课程。

余额充值