Linux下Socket连接超时的一种实现方法

目前各平台通用的设置套接字(Socket)连接超时的办法是:

创建套接字,将其设置成非阻塞状态。

调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误。

用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败。

以下是Linux环境下的示例代码:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <time.h>
int main(int argc, char *argv[])
{
        int fd, retval;
        struct sockaddr_in addr;
        struct timeval timeo = {3, 0};
        socklen_t len = sizeof(timeo);
        fd_set set;
        fd = socket(AF_INET, SOCK_STREAM, 0);
        if (argc == 4)
                timeo.tv_sec = atoi(argv[3]);
        fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr(argv[1]);
        addr.sin_port = htons(atoi(argv[2]));
        printf("%d\n", time(NULL));
        if (connect(fd, (struct sockaddr*)&addr, sizeof(addr)) == 0) {
                printf("connected\n");
                return 0;
        }
        if (errno != EINPROGRESS) {
                perror("connect");
                return -1;
        }
        FD_ZERO(&set);
        FD_SET(fd, &set);
        retval = select(fd + 1, NULL, &set, NULL, &timeo);
        if (retval == -1) {
                perror("select");
                return -1;
        } else if(retval == 0) {
                fprintf(stderr, "timeout\n");
                printf("%d\n", time(NULL));
                return 0;
        }
        printf("connected\n");
        return 0;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索select
, printf
, include
, return
, 套接字
RETVAL
linux socket 超时、linux socket超时设置、linux socket超时时间、linux socket连接超时、linux socket实现,以便于您获取更多的相关知识。

时间: 2024-10-30 20:34:11

Linux下Socket连接超时的一种实现方法的相关文章

Linux下php连接SQLServer 2000数据库的配置方法_Linux

说明: Linux服务器系统:CentOS 5.5 Web环境:LAMP或者LNMP Windows服务器系统:Windows Server 2003 Windows服务器IP地址:192.168.21.134 数据库环境:SQL Server 2000数据库 数据库账号:sa 数据库密码:123456 实现目的:Linux服务器中的php程序能够连接到Windows服务器中的SQL Server 2000数据库 具体步骤: 一.在Linux服务器中安装freetds 1.安装编译工具及驱动程序

Socket连接超时(转)

Socket.connect连接超时有二种情况: 1.由于网络的问题,TCP/IP三次握手时间>timeout的设置时间.这在国外访问weibo时,并且网络环境极差的情况下有可能发生.解决的办法:调大socket.connect方法中的timeout参数值,比如50s,linux默认最高是70s,如果超过70s没有意义,linux会采用70s.但是当调大之后,发现不到10s就报timeout exception.通过国外的机器ping api.weibo.com发现unreachable.说明客

Linux 下Socket编程基础

1. 引言Linux的兴起可以说是Internet创造的一个奇迹.Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX.UNIX System V 和 BSD UNIX 等)的多用户.多任务的具有复杂内核的操作系统.在中国,随着Internet的普及,一批主要以高等院校的学生和ISP的技术人员组成的Linux爱好者队伍已经蓬勃成长起来.越来越多的编程爱好者也逐渐酷爱上这个优秀的自由软件.本文介绍了Linux下Socket的基本概念和函数调用. 2. 什么是So

Linux下实现定时器Timer的几种方法总结_Linux

定时器Timer应用场景非常广泛,在Linux下,有以下几种方法: 1,使用sleep()和usleep() 其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了.使用这种方法缺点比较明显,在Linux系统中,sleep类函数不能保证精度,尤其在系统负载比较大时,sleep一般都会有超时现象. 2,使用信号量SIGALRM + alarm() 这种方式的精度能达到1秒,其中利用了*nix系统的信号量机制,首先注册信号量SIGALRM处理函数,调用alarm(),设置定时长度,代码

linux下lftp连接ftp服务器上传下载命令

  linux下lftp连接ftp服务器上传&下载 Java代码 用法: lftp ftp://用户名:密码@IP > 下载目录 mirror DIRNAME [下载整个目录里包含子目录,推荐此命令] 上传目录 mirror -R DIRNAM 下载目录 ... 用法: lftp ftp://用户名:密码@IP > 下载目录 mirror DIRNAME [下载整个目录里包含子目录,推荐此命令] 上传目录 mirror -R DIRNAM 下载目录 方法一 > mget -d D

解决Linux下tomcat连接MySQL数据库问题

mysql|解决|数据|数据库|问题 解决Linux下tomcat连接MySQL数据库 在linux下,开发一个web应用,期间调用数据库时总是不成功,如果单独写一个类,并编译执行访问数据库,正常,但是用web应用来调这个类连接数据库,就会出现错误:com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION **

linux下adb连接失败的怎么解决

不管是在Windows系统还是在Linux系统中,相信不少用户或开发者都遇到过手机adb连接不上的情况.其实出现这种问题很多时候是由于 adb冲突导致的,毕竟很多软件都有自己的adb链接.那么,出现这种问题该怎么办呢?下面就给大家介绍下Mac或者linux下adb连接失败的解决办法. 1.查看设备VenderID 在mac下 或者Linux打开终端(Terminal),linux下可以按快捷键(CTRL+T,忘了具体是不是大家去试试或者查查),mac下Control+space,输入Termin

linux下python3连接mysql数据库问题_linux shell

python语言的3.x完全不向前兼容,导致我们在python2.x中可以正常使用的库,到了python3就用不了了.比如说mysqldb 1.安装pymysql pymysql就是作为python3环境下mysqldb的替代物,进入命令行,使用pip安装pymysql pip install pymysql3 2.使用pymysql 在我们需要使用数据库的.py文件开头添加下面两行 import pymysql pymysql.install_as_MySQLdb() 第一行是引入pymysq

Linux下挂载硬盘分区的几种方法_unix linux

Linux下挂载硬盘分区的几种方法 1.使用Autofs自动挂载分区 2.修改/etc/fstab 3.编写shell脚本,开机自动运行mount命令  方法一.使用Autofs  1.Autofs的特点:Autofs与Mount/Umount的不同之处在于,它是一种看守程序(deamon).如果它检测到用户正试图访问一个尚未挂接的文件系统,它就会自动检测该文件系 统,如果该文件系统存在,那么Autofs会自动将其挂接.另一方面,如果它检测到某个已挂接的文件系统在一段时间内没有被使用,那么Aut