范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Csocket非阻塞模式

  一、前言
  初期学习socket的时候,为了方便理解,使用默认的阻塞模式比较多。而实际做项目时,我们必须考虑程序的并发性,非阻塞模式在其中担任着很重要的角色,是必会的点之一。本文不对阻塞IO和非阻塞IO的概念做说明,不了解的请自行了解。下文代码以linux平台为例。
  二、设置非阻塞模式
  设置非阻塞模式,通过fcntl方法设置,为了保存socket其他设置,一般选择先获取 status flags, 并在其基础上设置O_NONBLOCK属性, 代码如下:int flags = fcntl(fd, F_GETFL, 0); fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  fcntl失败返回值为-1, 同时errno会被设置成对应的错误码。(errno在此不做说明,不了解的自行了解。) 考虑失败的情况,个人注意到网上有些例子(包括ss-libev项目)在 F_GETFL 失败后,给了flags默认值,代码如下:int flags; if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {   flags = 0; } fcntl(fd, F_SETFL, flags | O_NONBLOCK);
  经过测试,默认情况下,flags得到的值为2,也就是O_RDWR 读写, 而 0 对应的相关宏为O_RDONLY只读,明显不合理。个人感觉,对于一个正常的socket来说,F_GETFL 出错的机会不大吧, 至少我是没遇到过。如果实在出错了,还是建议走错误流程而不是给个默认值。
  三、 非阻塞server
  server端通常在accept后,我们为客户端连接的fd设置为非阻塞。设置O_NONBLOCK后,recv和send发生了变化。默认阻塞模式下,recv在没有数据可以接收(对方未发数据,或者缓冲区的数据已读完对方没有继续发)情况下,recv会阻塞等待,直到下次有数据发送过来。而非阻塞模式下,recv在没有数据可以接收的时候, recv会直接返回-1, 同时errno会被设置为EAGAIN/EWOULDBLOCK 。同理,非阻塞send也会在对方缓冲区满的情况下直接返回-1并设置errno, 而不是阻塞等待。 非阻塞模式下server代码大致如下:int cli_fd = accept(listen_fd, NULL, NULL);   //... //省略出错判断和设置非阻塞 //... while (true) {     int n = recv(cli_fd, buf, buf_len, 0);     if (n < 0) {         if (errno == EAGAIN || errno == EWOULDBLOCK) {             //无数据,做其他业务逻辑或继续下一轮逻辑, 这里sleep一秒并接着等数据             sleep(1);             continue;         } else {           	//错误,可利用errno判断出错原因,这里直接结束             close(cli_fd);           	break;         }     } else if (n == 0) {         //对方关闭       	close(cli_fd);         break;     }     //正常读到数据,处理buf }
  四、非阻塞client
  client除了在send/recv, 还可以在connect前设置非阻塞模式,这样在connect时候可以直接返回。
  client 非阻塞connect的时候,如果返回0表示连接成功,如果返回-1, 则需要判断errno 是否为EINPROGRESS,EINPROGRESS表示非阻塞连接不能立刻获取connect结果,后面可使用select/poll/epoll等对socket 可写性进行判断,如果socket已可写,使用getsockopt(iSocket, SOL_SOCKET, SO_ERROR ,&err, &len)进行判断…好像挺麻烦是不是,但是我还是建议在大部分项目中connect前设置非阻塞(小工具之类的就无所谓了,项目中一定要保证效率)。如果使用阻塞模式,有可能的问题: 如果是桌面程序,你的程序可能会卡住无响应。如果你单独为connect开一个线程,可能加大资源消耗,特别是需要connect多个对象的时候。如果你使用线程池,非阻塞connect会导致线程处理效率下降。
  下面是个非阻塞connect的部分代码, 使用select, 至于poll/epoll请自行搜索代码,跟非阻塞逻辑无关:int fd; //...省略N行代码,socket的初始化,准备服务器信息等 set_nonblocking(fd); int ret = connect(fd, (struct sockaddr*)&serv_addr, serv_len); if (0 == ret) {   //连接成功,直接进入正常业务逻辑 } else {   if (EINPROGRESS != errno) {     //出错,结束     close(fd);     return;   }   //EINPROGRESS 继续判断 }  //使用select对fd进行可写判断 struct timeval tv; tv.tv_sec = timeout; tv.tv_usec = 0; fd_set sets; FD_ZERO(&sets); FD_SET(fd, &sets);  ret = select(fd + 1, NULL, &wds, NULL, &tv); if (ret > 0) {    if (FD_ISSET(fd, &sets)) {     int err = -1;     socklen_t len = sizeof(int);     ret = getsockopt(fd,  SOL_SOCKET, SO_ERROR ,&err, &len)      if (ret < 0 || err ) {         close(fd);         return;     }     //连接成功          //其实个人觉得如果可写后需要直接send,不需要getsockopt直接通过send也可以知道结果   } } else if (ret == 0) {   //超时逻辑 } else {   //select出错逻辑 }

想买个彩电,海信的ULED技术怎么样?海信ULED确实厉害,目前在国内外的技术领先有目共睹。目前海信55英寸的ULED电视大概5k6k,也属于大屏电视中高档位行列,可见地位之高。有关ULED技术的先进性题主大可以自己找互联网运营师有哪些就业方向?由于在互联网产品当中,用户的持续参与成为了产品的核心价值之一。为了能让用户持续参与进来并创造更多的价值,因此产生了运营这类工作。相对于产品负责界定和提供长期用户价值,运营负责创造短联想的警钟敲醒了谁?敲醒了那些伴着两面人生的戏精贪官,跪舔西方屁眼时间久了,而直不起腰的崇洋媚外者叛徒特务奸细!随着日益强大的新中国,这些眉骨百像恶态的恶心人,将会被中国人民抛弃敲醒了人民大众,不要再2021年了,电脑主机还有必要配E3吗?由于此前E3处理器在规格和性能方面接近同代i7处理器,而价格则和同代i5接近,E3处理器可以使用普通电脑主板,所以E3处理器一直以来都深受电脑用户的喜爱,而从三代E3处理器后,In老用户大量流失,风评还不如OV,为什么小米手机口碑越来越差?试着买了一个红米k30至尊纪念版居然TM的断流没信号到没法用,系统还不如我荣耀v10,不知道为什么至尊纪念版都敢这么干,脸都不要了,小米还能留证据什么。我买的米8每天自己重启死机最华为Mate40Pro新售价已定,128GB版跌破4900,华为P50Pro不香了说到高端旗舰手机,相信大家印象中第一个也就是苹果的iPhone了,毕竟iPhone不像安卓手机一样覆盖低中高三个层级,起步的售价就定在5千多,就连iPhoneSE的起售价也在329未删除非法内容,谷歌在俄罗斯遭罚款300万卢布财经网科技11月30日讯,据新浪科技消息,莫斯科法院向谷歌开出300万卢布罚单(约40400美元),因为谷歌没有删除非法内容。在处理被禁内容时,因为搜索引擎和YouTube多次违规打造产业集群效应,汽车芯片创新成果集中对接近日,由北京经济技术开发区管理委员会主办,中国汽车芯片产业创新战略联盟承办的三城一区高校创新成果对接会(以下简称创新成果对接会)圆满落下帷幕。会议邀请北京市三城一区高校院所的专家学小鹏汽车李鹏程探索未来出行智能时代加速到来分享全文大家好,我是小鹏汽车李鹏程,在小鹏汽车负责整个的品牌和公关,2019年加入这个团队,伴随着中国智能汽车的成长,我也跟小鹏汽车一起走过了接近三年时间。在这三年里,我们能看到中Android12快速适配要点,永远别为适配掉光了头发作者恋猫de小郭Android12需要更新适配点并不多,本篇主要介绍最常见的两个需要适配的点androidexported和SplashScreen。一androidexporte三大举措助推!中国芯投入8000亿后,美59家巨头发出联名信对华为芯片禁令的实施,以及把我国多个企业加入实体清单,看似对我们的企业实施了制裁,实际上美企受损也非常厉害,这个从美半导体协会的警告就能明白。并且更大的反应是,我国企业因此已经彻底
4月新交规实施超载20不扣分,车主五座车坐6人会被罚吗?请您在阅读前,先点击上面的关注。感谢您的支持,我们将为您带来更多有价值的内容。4月份新交规已经实施了一个星期了,但是很多机动车车主还是雾里看花,对于新规实施的细节还是搞不清楚。其中银保监会严禁银行保险机构违规向小微企业收取服务费用或变相转嫁服务成本北京商报讯(记者宋亦桐)4月8日,银保监会办公厅发布关于2022年进一步强化金融支持小微企业发展工作的通知(以下简称通知)指出,银行业金融机构要加快推进小微企业简易开户服务,根据企荣耀Play6T系列正式发布售价1199元起荣耀Play6T系列正式发布售价1199元起科创板日报7日讯,荣耀Play6T系列于今日正式发布,配备6。7英寸屏幕,全系支持90Hz屏幕刷新率,并率先在10001500元档的新机新能源和燃油车的选择随着低碳环保的理念日进人心,新能源车型也进入了大家的家庭。但是选择的多样性也给许多观望的车友们带来的幸福的烦恼,那么到底那种能源的车更适合自己呢?我有这么一些观点。首先,新能源的车腾讯投资快充动力电池研发商巨湾技研南方财经4月8日电,企查查APP显示,4月6日,广州巨湾技研有限公司发生工商变更,新增广西腾讯创业投资有限公司等多名股东,同时公司注册资本由7261。7万元人民币增加至8031。4网传蔚来员工利用公司服务器挖矿,官方暂未回应挖什么矿?怎么挖?4月6日,有微博网友发帖称蔚莱内部有一员工利用职务之便,使用公司服务器资源挖掘虚拟货币。经查,该员工自去年2月开始,利用公司服务器算力资源违规进行虚拟货币以太币(小康股份71亿元定增获批通过本报记者王鹤5月23日,小康股份(601127)发布公告称,公司非公开发行股票申请获得中国证监会发审会审核通过。此前发布的公告显示,小康股份拟募集资金71。3亿元,扣除发行费用后的小康股份71亿元定增获批通过,拟发不超过1。63亿股投新能源5月23日晚间,小康股份(601127)发布公告,5月23日当天,公司2022年非公开发行股票申请,获得中国证监会发审委审核通过。据悉,小康股份拟募资不超过71。3亿元,投向新能源我国云上服务构建教育新形态为实现个性化教学提供可能原标题有力促进优质教学资源的集成共享云上服务构建教育新形态今年3月28日,国家智慧教育公共服务平台正式上线,为部分学校停课不停学提供有效服务。据统计,该平台上线以来,线上教育资源增解读一台美国1960年出厂钟控电子管串丝珍妮丝zenitn收音机前一段时间在跳蚤市场一个专业的有海外老物件的人士手上已当时人民币的价格400元整淘一台美国钟控电子管串丝珍妮丝zenitn收音机,查询海外的论坛资料生产时间是上世纪50到60年代,科创板芯片指数6月13日发布,首批样本股有中芯国际科创板001和002号等42家5月20日,N思特威W(688213)登陆科创板,收盘报56。66元股,涨幅79。82。该公司从事CMOS图像传感器芯片产品研发设计和销售,总部在上海,在多个城市及国家设有研发中心