问题描述

北京项目通过调用我们提供的库libsigxt.a与加密机通信,c/s架构,客户端启用多个线程,每个线程流程有以下三步,连接加密机,签名,关闭链接。在正常运行一段时间后会出现不能连接加密机服务问题。

连接服务器代码如下:

setnonblocking(sk_fd);

ret = connect(sk_fd, (struct sockaddr *)&sa_serv, server_len);
    P_DEBUG("main connect ret:%d\n",ret);
    if(ret < 0){
        if(errno != EINPROGRESS){
            P_DEBUG("mainip connect error ret.\n");
        }else{
            tv.tv_sec = timeout;
            tv.tv_usec = 0;
            fd_set wset;
            FD_ZERO(&wset);
            FD_SET(sk_fd,&wset);
            ret = select(sk_fd+1,NULL,&wset,NULL,&tv);
            printf("main select ret is %d\n",ret);
            if(ret<0){
                P_DEBUG("mainip select error,can not connect to server.\n");
            }else if(ret == 0){
                P_DEBUG("mainip connect timeout.\n");
            }else{
                if(FD_ISSET(sk_fd,&wset)){
                    P_DEBUG("mainip connect successful.\n");
                    setblocking(sk_fd);
                }else{
                    P_DEBUG("not fd_isset(). not connected.\n");
                    goto quit;
                }    
            }
        }
    }

先设置非阻塞模式,然后通过connect连接,当返回0时,表示连接成功;当返回-1,并且errno 为 EINPROGRESS表示正在连接过程中,通过select监听wset,当select返回小于0时,表示连接失败;当select返回0时,表示超时;当返回大于0时,表示连接成功,重新再设置成阻塞模式。

根据现场日志打印,当select返回非1的正数,则监听不到可写事件,连接失败,发送数据也失败。

原因查找定位

通过网上搜索发现,1024限定的不只是监听的个数,还是文件描述符的最大值。FD_SETSIZE限制了文件描述符的个数。
但是根据fd_set存储文件描述符的原理,FD_SETSIZE限制的应该是文件描述符的最大值,当然限制了最大值也就限制了个数。

下面一段摘自man select中的原话
"Executing FD_CLR() or FD_SET() with a value of fd that is negative or is equal to  or larger than FD_SETSIZE will result in undefined behavior."

再查下现场打开的描述符个数,的确大于1024,造成select返回的结果不可预期。

解决方案

既然select使用除了问题,那就换成epoll来监听,修改代码如下:

setnonblocking(sk_fd);

ret = connect(sk_fd, (struct sockaddr *)&sa_serv, server_len);
        if(ret == 0){
            goto connect_success;
        }
        
        if(ret<0 && errno != EINPROGRESS){
            P_DEBUG("back connect failed.\n");
            goto connect_failure;    
        }

if((epfd = epoll_create(1))<0){
            P_DEBUG("main epoll create error.\n");
            goto connect_failure;
        }
        memset(&ev, 0, sizeof ev);
        ev.events = EPOLLOUT;
        ev.data.fd = sk_fd;

if(epoll_ctl(epfd, EPOLL_CTL_ADD, sk_fd, &ev)<0){
            P_DEBUG("main epoll_ctl error.\n");
            goto connect_failure;
        }
        
        n = epoll_wait(epfd,events,1,itimeout);
        P_DEBUG("back epoll_wait n is %d\n",n);
        if(n<=0 || events[0].events & EPOLLERR){
            P_DEBUG("back connect failure.\n");
            goto connect_failure;
        }

connect_success:
    
    P_DEBUG("connect success.\n");
    setblocking(sk_fd);

......

connect_failure:
    if(sk_fd>0)
        close(sk_fd);
    sk_fd = -1;
    if(epfd>0)
        close(epfd);
    return -1;

}

经测试发现,没有再出现连接失败问题。

结论:建议linux下弃用select。

北京加密机现场select问题相关推荐

  1. 官宣,北京杜绝现场复试!清华等全国多地高校确定将网络远程复试

    转载于 软科 4月22日深夜,武汉大学发布2020年考研复试分数线.刚刚(23日下午),华中科技大学也发布了分数线.截止目前,34所自划线高校分数线已出齐. 知道分数线之后,就该准备接下来的复试了.2 ...

  2. hihoCoder - 1633(2017北京icpc现场赛-G题)

    题意:给你一个三角形的三个坐标,还有一张图,让你从图中的左下角走到右上角,左下角坐标是(0,0),每两点之间的长度是1,'.'代表能走,'#'代表不能走,并且每条路径不能碰到三角形内部,让你求最短路径 ...

  3. 北京地铁十号线现场考察

    地铁十号线6月1日就正式通车了,5号线的贯通已经给我们的出行带来了莫大的方便,十号线更值得期待.正好地铁内有几个项目前期要做现场考察,所以得以机会进入地铁,提前一睹十号线的芳容. 进入地铁的时候正赶上 ...

  4. 2017ACM-ICPC北京区域现场赛 G题 hihocoder1633

    传送门:点击打开链接 题意:一个N*N的网格,从左下角走到右上角需要的最短步数.要求不能经过# 而且路径不能经过一个三角形的内部,可以沿边走. 分析:计算几何题里不算难题,但若没想到坑点就一直卡题了. ...

  5. 布衣乐队的姑娘闪亮星光现场

    布衣乐队的姑娘闪亮星光现场 由摩登天空举办的中国现代音乐周第二场摩登摇滚趴(Rock China)专场在北京星光现场盛大上演.布衣乐队带来了<我爱你亲爱的姑娘>.<世事难料>. ...

  6. GAAS·北京 | 全球资产与科技赋能——2020全球资产配置前瞻峰会

    2019年11月16日,由e代理和AnlanCapital主办的"洞见未来 · 2020全球资产配置前瞻"在北京隆重召开. 在整整一天的峰会中,数十位行业专家学者,包括知名宏观经济 ...

  7. Mysql 查询 select

    -- create table students ( -- studentNo varchar(10) primary key, -- name varchar(10), -- sex varchar ...

  8. layui - 页面元素

    参考:https://www.layui.com/doc/base/element.html 内容包括:css (即已定义样式的class).HTML (即一些layui自定义的属性) 细分为:布局. ...

  9. BERT相关论文、文章和代码资源汇总

    转自:http://www.52nlp.cn/tag/transformer BERT相关论文.文章和代码资源汇总 4条回复 BERT最近太火,蹭个热点,整理一下相关的资源,包括Paper, 代码和文 ...

最新文章

  1. python multi_python – 堆叠MultiIndex的所有级别
  2. mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句
  3. 使用HTML5 IndexDB存储图像和文件
  4. 网站服务器怎么用手机登录不了怎么办,怎么打不开服务器列表了?
  5. 计算机都要学python吗_大学计算机要不要学python?
  6. NYOJ77 - 开灯问题
  7. Oracle 进程 说明
  8. pxe安装linux系统工具,Linux的PXE自动化无人值守安装系统
  9. 飞信2008内测版下载
  10. html当当书网站 html网上在线书城 html在线小说书籍网页 当当书城网页设计
  11. 巨建华担任BCF理事
  12. 指纹识别技术的发展前景是怎样的?
  13. linux cpu 时间,【Linux】CPU时间与处理器耗时
  14. Python爬虫:js的btoa和atob和pythonBase64编码解码比对分析
  15. 华为服务器bios系统,华为服务器bios配置详解
  16. res资源文件学习之res/values/attr.xml
  17. php外边框样式,CSS的边框样式
  18. go get 不了,就使用 go.mod中的replace来引入远程包(需要把远程包下载在本地)
  19. DirectDraw高彩模式编程入门
  20. SpringBoot实现文件上传

热门文章

  1. 【转】更改远程桌面默认端口3389及删除远程桌面连接历史记录
  2. Rose与PowerDesigner:两款建模工具对比分析比较
  3. 字符大小端aix linux,long, unsigned long不是跨平台的(慎用)
  4. arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...
  5. python 购物车程序_python_购物车程序
  6. golang jwt设置过期_听说你的JWT库用起来特别扭,推荐这款贼好用的!
  7. java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
  8. java 枚举 values_JAVA 枚举运用一 values方法
  9. javaScript DOM编程常用的方法与属性
  10. java 批量处理 示例_Java中异常处理的示例