北京加密机现场select问题
问题描述
北京项目通过调用我们提供的库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问题相关推荐
- 官宣,北京杜绝现场复试!清华等全国多地高校确定将网络远程复试
转载于 软科 4月22日深夜,武汉大学发布2020年考研复试分数线.刚刚(23日下午),华中科技大学也发布了分数线.截止目前,34所自划线高校分数线已出齐. 知道分数线之后,就该准备接下来的复试了.2 ...
- hihoCoder - 1633(2017北京icpc现场赛-G题)
题意:给你一个三角形的三个坐标,还有一张图,让你从图中的左下角走到右上角,左下角坐标是(0,0),每两点之间的长度是1,'.'代表能走,'#'代表不能走,并且每条路径不能碰到三角形内部,让你求最短路径 ...
- 北京地铁十号线现场考察
地铁十号线6月1日就正式通车了,5号线的贯通已经给我们的出行带来了莫大的方便,十号线更值得期待.正好地铁内有几个项目前期要做现场考察,所以得以机会进入地铁,提前一睹十号线的芳容. 进入地铁的时候正赶上 ...
- 2017ACM-ICPC北京区域现场赛 G题 hihocoder1633
传送门:点击打开链接 题意:一个N*N的网格,从左下角走到右上角需要的最短步数.要求不能经过# 而且路径不能经过一个三角形的内部,可以沿边走. 分析:计算几何题里不算难题,但若没想到坑点就一直卡题了. ...
- 布衣乐队的姑娘闪亮星光现场
布衣乐队的姑娘闪亮星光现场 由摩登天空举办的中国现代音乐周第二场摩登摇滚趴(Rock China)专场在北京星光现场盛大上演.布衣乐队带来了<我爱你亲爱的姑娘>.<世事难料>. ...
- GAAS·北京 | 全球资产与科技赋能——2020全球资产配置前瞻峰会
2019年11月16日,由e代理和AnlanCapital主办的"洞见未来 · 2020全球资产配置前瞻"在北京隆重召开. 在整整一天的峰会中,数十位行业专家学者,包括知名宏观经济 ...
- Mysql 查询 select
-- create table students ( -- studentNo varchar(10) primary key, -- name varchar(10), -- sex varchar ...
- layui - 页面元素
参考:https://www.layui.com/doc/base/element.html 内容包括:css (即已定义样式的class).HTML (即一些layui自定义的属性) 细分为:布局. ...
- BERT相关论文、文章和代码资源汇总
转自:http://www.52nlp.cn/tag/transformer BERT相关论文.文章和代码资源汇总 4条回复 BERT最近太火,蹭个热点,整理一下相关的资源,包括Paper, 代码和文 ...
最新文章
- python multi_python – 堆叠MultiIndex的所有级别
- mysql install语句_mysql8 参考手册--INSTALL COMPONENT语句
- 使用HTML5 IndexDB存储图像和文件
- 网站服务器怎么用手机登录不了怎么办,怎么打不开服务器列表了?
- 计算机都要学python吗_大学计算机要不要学python?
- NYOJ77 - 开灯问题
- Oracle 进程 说明
- pxe安装linux系统工具,Linux的PXE自动化无人值守安装系统
- 飞信2008内测版下载
- html当当书网站 html网上在线书城 html在线小说书籍网页 当当书城网页设计
- 巨建华担任BCF理事
- 指纹识别技术的发展前景是怎样的?
- linux cpu 时间,【Linux】CPU时间与处理器耗时
- Python爬虫:js的btoa和atob和pythonBase64编码解码比对分析
- 华为服务器bios系统,华为服务器bios配置详解
- res资源文件学习之res/values/attr.xml
- php外边框样式,CSS的边框样式
- go get 不了,就使用 go.mod中的replace来引入远程包(需要把远程包下载在本地)
- DirectDraw高彩模式编程入门
- SpringBoot实现文件上传
热门文章
- 【转】更改远程桌面默认端口3389及删除远程桌面连接历史记录
- Rose与PowerDesigner:两款建模工具对比分析比较
- 字符大小端aix linux,long, unsigned long不是跨平台的(慎用)
- arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...
- python 购物车程序_python_购物车程序
- golang jwt设置过期_听说你的JWT库用起来特别扭,推荐这款贼好用的!
- java抽象类异常_求教JAVA里面的错误继承抽象类我都已经看傻了。
- java 枚举 values_JAVA 枚举运用一 values方法
- javaScript DOM编程常用的方法与属性
- java 批量处理 示例_Java中异常处理的示例