当前位置: 首页 > news >正文

tcp中设置连接超时

直接上代码:

设置连接超时

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

unsigned long ul=1;
int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); 
if(rm==-1)
{
  printf("ioctl noblock error!\n");
  close(sConnect); 
  return -3; 
}

//向服务器发出连接请求 
int err = connect(sConnect, (struct sockaddr*)&addrServer, sizeof(addrServer));

//正常返回EINPROGRESS

if(err && errno!=EINPROGRESS) 
{
  printf("cannot connect:%s\n",severAgent);
  return -4;
}

//有可能返回0
if (err==0)
{
  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=0;
        int retval = select(sConnect+1,0,&w,0,&tv);
        if(retval==-1)
        {
            printf("select error\n");
            return -5;
        }
        else if(retval == 0)
        {
            printf("connect timeout\n");
            return -6;
        }
        else
        {
            int er;
            socklen_t len = sizeof(er);
            if (getsockopt(sConnect, SOL_SOCKET, SO_ERROR, (char *)&er, &len) < 0) {
                //getsockopt()失败,进行错处理
                printf("getsockopt error\n");
                return -8;
            }
            if (er != 0) {
                //connect()失败,进行错处理
                printf("connect error\n");
                return -9;
            }
        }
}
//改为阻塞 ul
=0; rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); if(rm==-1) { printf("ioctl block error!\n"); close(sConnect); return -7; }

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

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

       二者还是有点区别的。

 

转载于:https://www.cnblogs.com/bigfi/p/7389810.html

相关文章:

  • shell逻辑控制语句之case
  • 删除txt文件内容
  • 硬链接和软链接 创建
  • PHP用swoole实现爬虫(二)
  • 语音识别(SR)的秘密
  • iOS 高德地图轨迹回放的 思路, 及方法
  • Redis - 事务
  • P1077 摆花
  • 过滤器与监听器知识总结
  • 数位DP入门
  • js匿名函数
  • Could not resolve resource location pattern错误解决方案
  • PAT乙级-1026. 程序运行时间(15)
  • HTTP中GET与POST的区别 99%的错误认识
  • 好汉两个半第十二季/全集Two and a Half Men迅雷下载
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Git 使用集
  • java小心机(3)| 浅析finalize()
  • nfs客户端进程变D,延伸linux的lock
  • python 装饰器(一)
  • Vue2.x学习三:事件处理生命周期钩子
  • Web Storage相关
  • 力扣(LeetCode)357
  • 那些年我们用过的显示性能指标
  • 判断客户端类型,Android,iOS,PC
  • 如何进阶一名有竞争力的程序员?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 三分钟教你同步 Visual Studio Code 设置
  • 时间复杂度与空间复杂度分析
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 一些关于Rust在2019年的思考
  • 异步
  • 用mpvue开发微信小程序
  • 在Unity中实现一个简单的消息管理器
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • $.each()与$(selector).each()
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (汇总)os模块以及shutil模块对文件的操作
  • (循环依赖问题)学习spring的第九天
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转载)hibernate缓存
  • ***测试-HTTP方法
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .jks文件(JAVA KeyStore)
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET业务框架的构建
  • @Transient注解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [.NET]桃源网络硬盘 v7.4
  • [Android]Tool-Systrace
  • [ARM]ldr 和 adr 伪指令的区别