同事今天问我,如何在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 客户端Socket 非阻塞 connect 编程详解 本文档详细介绍了 Linux 客户端 Socket 非阻塞 connect 编程的实现方法和原理。非阻塞 connect 是一种高效的网络编程技术,能够提高程序的性能和可靠性。 一、非阻塞 ...
Linux下的Socket编程实例(阻塞和非阻塞) 通过分析给定的文件信息,我们可以生成以下知识点: Socket编程概述 Socket 编程是指使用操作系统提供的 socket 编程接口来实现网络通信的编程方式。Socket 编程可以实现...
Linux 客户端 Socket 非阻塞 connect 编程收集 本文档主要讨论了 Linux 客户端 Socket 非阻塞 connect 编程的实现与应用,非阻塞 connect 编程的主要用途有三种: 1. 三次握手同时做其他的处理。在 connect 过程中...
Linux 下 Socket 连接超时的一种实现方法 在 Linux 环境下,设置套接字(Socket)连接超时是一件非常重要的事情。下面我们将详细介绍 Linux 下 Socket 连接超时的一种实现方法。 首先,需要创建套接字,并将其设置...
总结起来,Linux下的多线程阻塞模式socket编程是一种有效且常见的网络通信方式,通过合理的线程管理和数据同步,可以实现高效、稳定的服务。server02.c和client02.c的代码可以作为学习和实践的示例,帮助我们更好地...
在Windows环境下进行网络编程时,有时需要对socket连接进行超时控制,特别是在客户端与服务器通信的过程中,如果连接请求长时间没有响应,程序可能会陷入无休止的等待状态,从而导致资源浪费甚至程序卡死。...
综上所述,`select`方式的并发服务器模型在Linux下的Socket编程中具有重要的应用价值,它允许服务器高效地处理多个并发连接,是构建网络服务的基础之一。通过分析`tcpserver.c`和`tcpclient.c`的源代码,我们可以...
总结,Linux下的Socket文件传输涉及TCP连接的建立、文件的读写操作以及Socket API的使用。这种机制灵活且强大,适用于各种网络环境,包括标准PC和嵌入式系统。在实际开发中,需要结合具体需求,充分考虑性能、安全和...
Linux系统下socket编程是网络编程的核心部分,涉及到进程间通信与网络资源的交互。在进行socket编程时,经常需要处理不同的错误码,这些错误码帮助开发者了解程序运行过程中遇到的具体问题。在Linux中,socket错误码...
总之,理解并掌握Linux下的异步通信socket编程,对于开发高性能的网络应用至关重要。通过合理地使用`select`或其他更高级的I/O多路复用技术(如`epoll`),可以极大地提升网络应用的并发能力和效率,满足日益增长的...
总的来说,这个Linux下的Socket聊天软件项目涵盖了网络通信的基础知识,包括Socket的创建、连接、数据传输以及多用户处理。尽管还有待完善,但这个项目为学习和实践Socket编程提供了很好的平台,也为进一步的优化和...
本文将深入探讨Linux下的Socket编程,尤其是通过C语言实现的相关知识。 首先,我们需要了解Socket的基本概念。Socket可以看作是网络上的端点,用于发送和接收数据。在Linux中,Socket编程涉及到以下几个关键步骤: ...
总的来说,这个Linux Socket教程全面地覆盖了从基本的Socket创建到高级的网络编程技术,对于任何想要在Linux环境下进行网络编程的开发者来说,都是一份宝贵的资源。通过深入学习这些文档,读者将能够熟练地构建和...
在Linux系统中,C语言的Socket API是进行网络通信的核心工具,它允许程序员创建和管理套接字,实现客户端和服务器之间的数据交换。本篇将深入探讨Linux C Socket API的关键概念、常用函数以及其实现机制。 一、...
在IT行业中,Linux Socket是进行网络通信的重要工具,尤其对于系统和网络程序员来说,理解和掌握Linux Socket编程至关重要。本示例代码提供了客户端(client)和服务器端(server)的实现,帮助初学者深入理解如何在...
通过对这份源码的学习,你可以了解如何在Linux环境下编写基本的Socket程序,以及如何处理客户端与服务器间的交互。这对于进一步研究高级网络编程技术,如HTTP服务器、TCP/IP协议栈或者分布式系统设计都是宝贵的起点...
Linux下的Socket编程是开发网络应用程序的关键技术,它提供了一种标准接口,允许程序通过TCP/IP协议进行通信。Socket接口是TCP/IP网络编程的核心API,它最初在Unix操作系统中被引入,现在广泛应用于各种操作系统,...
本主题主要探讨的是如何使用C语言在Linux下实现基于socket的客户端和服务端通信,并且采用多线程技术,使得客户端和服务器可以相互发送消息而无需等待对方回应。 首先,我们来理解一下基本的socket通信流程。创建...
在Linux下,利用TCP/IP协议的Socket通信具有以下优势: 1. 可靠性:TCP协议提供顺序、无错的数据传输,适合实时系统对数据完整性的要求。 2. 流量控制:TCP有内置的流量控制机制,可以避免网络拥塞。 3. 拥塞控制:...