同事今天问我,如何在linux下的c代码里面控制connect的阻塞时间。应用的背景是:linux下的c程序有两个目标IP须要connect,若是用阻塞方式,当其中一个IP不能链接的状况下,程序将阻塞在connect函数上。
原本觉得用setsockopt修改个什么参数就能够搞定,结果baidu了半天也没有结果。却是在网上搜到不少这样的解决方案:将connect方式设置为非阻塞方式,这样程序一旦执行就会立刻返回,但问题是,到底有没有链接上呢,你须要等待一段时间,而后使用函数判断链接是否正常。试了下,貌似因为系统的区别,这个方法在个人linux环境下不适用,主要是后面判断是否链接上的函数不行,无论链接上或没链接上都返回一个值。
看来网上的方法也不能尽信,最后在公司前人的一段代码里面找到了解决方法,这里分享下:
sigset(SIGALRM, u_alarm_handler);
alarm(2);
code = connect(socket_fd, (struct sockaddr*)&socket_st, sizeof(struct sockaddr_in));
alarm(0);
sigrelse(SIGALRM);
首先定义一个中断信号处理函数u_alarm_handler,用于超时后的报警处理,而后定义一个2秒的定时器,执行connect,当系统connect成功,则系统正常执行下去;若是connect不成功阻塞在这里,则超过定义的2秒后,系统会产生一个信号,触发执行u_alarm_handler函数, 当执行完u_alarm_handler后,程序将继续从connect的下面一行执行下去。
其中,处理函数能够以下定义,也能够加入更多的错误处理。
void u_alarm_handler()
{
}
这个方法相对网上的作法而言代码量小,更精巧,看来老代码也是有不少值得学习的地方。
linux