直接上代码:

设置连接超时

//首先改成非阻塞套接字

unsigned long ul=;
int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul);
if(rm==-)
{
  printf("ioctl noblock error!\n");
  close(sConnect);
  return -;
} //向服务器发出连接请求
int err = connect(sConnect, (struct sockaddr*)&addrServer, sizeof(addrServer)); //正常返回EINPROGRESS if(err && errno!=EINPROGRESS)
{
  printf("cannot connect:%s\n",severAgent);
  return -;
} //有可能返回0
if (err==)
{
  printf("connect suceess!");
} else
{
struct timeval tv;
fd_set /*r,*/w;
// FD_ZERO(&r);
FD_ZERO(&w);
// FD_SET(sConnect,&r);
FD_SET(sConnect,&w);
tv.tv_sec=m_conTimeout;
tv.tv_usec=;
int retval = select(sConnect+,,&w,,&tv);
if(retval==-)
{
printf("select error\n");
return -;
}
else if(retval == )
{
printf("connect timeout\n");
return -;
}
else
{
int er;
socklen_t len = sizeof(er);
if (getsockopt(sConnect, SOL_SOCKET, SO_ERROR, (char *)&er, &len) < ) {
//getsockopt()失败,进行错处理
printf("getsockopt error\n");
return -;
}
if (er != ) {
//connect()失败,进行错处理
printf("connect error\n");
return -;
}
}
}
//改为阻塞
ul=;
rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul);
if(rm==-)
{
printf("ioctl block error!\n");
close(sConnect);
return -;
}

值得注意的是:linux中,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开启,则直接返回错误,也就是说超时过程不起作用,说明是已经做了目标网络检测了。

       但是window中,同样是以上的代码,如果服务器的地址无效,则以上超时过程正常。如果服务器地址有效,但是服务程序未开,以上超时过程也是正常的。

       二者还是有点区别的。

tcp中设置连接超时的更多相关文章

  1. [转]c# winform tcp connect timeout 连接超时设置

    转自:https://www.cnblogs.com/jhlong/p/5622336.html 简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的 ...

  2. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  3. 转 HttpClient 设置连接超时时间

    要: HttpClient 4.5版本升级后,设置超时时间的API又有新的变化,请大家关注. HttpClient升级到4.5版本后,API有很多变化,HttpClient 4之后,API一直没有太稳 ...

  4. HttpClient设置连接超时时间

    https://www.cnblogs.com/winner-0715/p/7087591.html 使用HttpClient,一般都需要设置连接超时时间和获取数据超时时间.这两个参数很重要,目的是为 ...

  5. Retrofit2.0 设置 连接超时

    Retrofit2.0 这个网络请求框架使用了很久了,最近一次出现一个小插曲. 有一个接口,返回的数据量因为业务的原因 会返回很大的数据量,此时网络不大好的情况下,会出现请求失败的情况 也就是回调了 ...

  6. (转)HttpURLConnection中设置网络超时

    转:http://www.xd-tech.com.cn/blog/article.asp?id=37 Java中可以使用HttpURLConnection来请求WEB资源.HttpURLConnect ...

  7. android 中设置HttpURLConnection 超时并判断是否超时

    设置超时: URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); c ...

  8. SqlConnection 无法设置连接超时

    1.最有效的方法:对表格建立索引 2 在连接字符串中设置 Connection Timeout (默认15秒)3 设置 SqlCommand.CommandTimeout(默认是 30 秒)

  9. connect设置连接超时

    转自:庖丁解牛 /** * connect_timeout - 带超时的connect(方法中已执行connect) * @fd:文件描述符 * @addr:地址结构体指针 * @wait_secon ...

随机推荐

  1. 编译器的系统include路径查询

    环境:Ubuntu 18.04.3 LTS 以 aarch64-linux-gnu-gcc 为例,运行如下命令: echo "main(){}" | aarch64-linux-g ...

  2. adb 常用命令汇总

    adb 常用命令: adb –help 查看帮助手册 adb devices 检测连接到电脑的安卓设备或安卓模拟器设备 adb pull  <手机路径>  <本机路径>  从手 ...

  3. (九)pdf的构成之文件体(content属性)

    content属性简单当成一个流来处理 流内部属一个画笔,下面介绍画笔属性 文本对象: BT    文本开始 ET    文本结束   文本状态:       Tc    字符之间的距离       ...

  4. golang 之 go-micro

    在安装之前首先需要对go-micro有一定的了解 https://micro.mu/docs/cn/  go-micro中文文档 https://juejin.im/post/5cebafe6f265 ...

  5. linux安装mysql后报错启动不了Starting MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).

    今天安装完Mysql后,开启发生了错误: 2.打开错误信息文件,查看错误原因是:Plugin 'FEDERATED' is disabled. /usr/sbin/mysqld: Table 'mys ...

  6. 2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐

    原文:2019 年在 Raspberry Pi 「树莓派」上运行的 10 个操作系统推荐 image Raspberry Pi** 是一款基于 ARM 的单板计算机,默认运行一款称为 Raspbian ...

  7. .net Dapper 实践系列(1) ---项目搭建(Layui+Ajax+Dapper+MySQL)

    目录 写在前面 一.前期准备 1.在MySQL创建数据库 2.创建项目 3.安装程序包 4.添加插件 5.添加DbOption文件夹 6.添加实体类 写在前面 学习并实践使用Dapper 这个小型的O ...

  8. IE浏览器 location.href 不跳转

    var url = "https://www.cnblogs.com/zing"; location.href = url; window.event.returnValue = ...

  9. python3 语法 数据类型

     python3中 有6种标准数据类型 数字,字符串,列表,元祖,集合,字典

  10. python pip安装解决方法

    一招解决python pip install 安装库失败   PIP是python强大的安装利器,但是我们经常遇到安装库失败的问题,以下本人觉得最有效的解决方法: 1.打开 https://www.l ...