直接上代码:

设置连接超时

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

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. 【转帖】Hadoop — HDFS的概念、原理及基本操作

    Hadoop — HDFS的概念.原理及基本操作 https://www.cnblogs.com/swordfall/p/8709025.html 分类: Hadoop undefined 1. HD ...

  2. 以Unicode(UTF-16 LE)编码保存文本

    1. 以二进制方式打开文件,写入BOM头 FILE* pFile = nullptr; _wfopen_s(&pFile, szLogFilePath, L"wb"); / ...

  3. 进程池和线程池、协程、TCP单线程实现并发

    一.进程池和线程池 当被操作对象数目不大时,我们可以手动创建几个进程和线程,十几个几十个还好,但是如果有上百个上千个.手动操作麻烦而且电脑硬件跟不上,可以会崩溃,此时进程池.线程池的功效就能发挥了.我 ...

  4. cookielib模块 for python3

    python2 可以直接安装cookielib模块 而py3却不能安装 故需要安装http模块 举例子: from http import cookiejar cookie = cookiejar.C ...

  5. 【Maven基础入门】01 Maven的安装与环境变量的配置

    写在前面: Mavne,作为一个优秀的项目构建工具,虽说我们平时在使用的时候或多或少的会使用到它,但了解仅限于它能构建项目,然后其他的就不知道了. 以及仓库.POM父类文件.等等. 工欲善其事,必先利 ...

  6. 解决打开IE报错“无法启动...丢失api-ms-win-core-path-l1-1-0.dll”的问题

    打开IE突然发现报错 试了各种方法都不行 最终看这篇文章,才解决:https://www.yijile.com/log/577.html 打开IE设置选项,选择管理加载项,如图讲该选项禁用,就不报错. ...

  7. 让js中的函数只有一次有效调用

    设置隐藏域~ <input type="hidden" value="1" id="flag" /> 其它三种方法

  8. DbParameter关于Like查询的传参数无效问题

    用传参方式模糊查询searchName 按常规的思路,我们会这样写 ,代码如下: String searchName ="Sam"; String strSql = "s ...

  9. html 随机验证码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 微信小程序代码开源啦

    想学习如何使用mpvue开发微信小程序吗? 想知道微信消息推送如何实现吗? 想知道如何用springboot开发小程序后台吗? 看这里就全都有了.耗时一个月打造的微信小程序:PSN折扣助手前后端所有源 ...