游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

Csocket非阻塞模式

  一、前言
  初期学习socket的时候,为了方便理解,使用默认的阻塞模式比较多。而实际做项目时,我们必须考虑程序的并发性,非阻塞模式在其中担任着很重要的角色,是必会的点之一。本文不对阻塞IO和非阻塞IO的概念做说明,不了解的请自行了解。下文代码以linux平台为例。
  二、设置非阻塞模式
  设置非阻塞模式,通过fcntl方法设置,为了保存socket其他设置,一般选择先获取statusflags,并在其基础上设置ONONBLOCK属性,代码如下:intflagsfcntl(fd,FGETFL,0);fcntl(fd,FSETFL,flagsONONBLOCK);
  fcntl失败返回值为1,同时errno会被设置成对应的错误码。(errno在此不做说明,不了解的自行了解。)考虑失败的情况,个人注意到网上有些例子(包括sslibev项目)在FGETFL失败后,给了flags默认值,代码如下:intflags;if(1(flagsfcntl(fd,FGETFL,0))){flags0;}fcntl(fd,FSETFL,flagsONONBLOCK);
  经过测试,默认情况下,flags得到的值为2,也就是ORDWR读写,而0对应的相关宏为ORDONLY只读,明显不合理。个人感觉,对于一个正常的socket来说,FGETFL出错的机会不大吧,至少我是没遇到过。如果实在出错了,还是建议走错误流程而不是给个默认值。
  三、非阻塞server
  server端通常在accept后,我们为客户端连接的fd设置为非阻塞。设置ONONBLOCK后,recv和send发生了变化。默认阻塞模式下,recv在没有数据可以接收(对方未发数据,或者缓冲区的数据已读完对方没有继续发)情况下,recv会阻塞等待,直到下次有数据发送过来。而非阻塞模式下,recv在没有数据可以接收的时候,recv会直接返回1,同时errno会被设置为EAGAINEWOULDBLOCK。同理,非阻塞send也会在对方缓冲区满的情况下直接返回1并设置errno,而不是阻塞等待。非阻塞模式下server代码大致如下:intclifdaccept(listenfd,NULL,NULL);。。。省略出错判断和设置非阻塞。。。while(true){intnrecv(clifd,buf,buflen,0);if(n0){if(errnoEAGAINerrnoEWOULDBLOCK){无数据,做其他业务逻辑或继续下一轮逻辑,这里sleep一秒并接着等数据sleep(1);continue;}else{错误,可利用errno判断出错原因,这里直接结束close(clifd);break;}}elseif(n0){对方关闭close(clifd);break;}正常读到数据,处理buf}
  四、非阻塞client
  client除了在sendrecv,还可以在connect前设置非阻塞模式,这样在connect时候可以直接返回。
  client非阻塞connect的时候,如果返回0表示连接成功,如果返回1,则需要判断errno是否为EINPROGRESS,EINPROGRESS表示非阻塞连接不能立刻获取connect结果,后面可使用selectpollepoll等对socket可写性进行判断,如果socket已可写,使用getsockopt(iSocket,SOLSOCKET,SOERROR,err,len)进行判断好像挺麻烦是不是,但是我还是建议在大部分项目中connect前设置非阻塞(小工具之类的就无所谓了,项目中一定要保证效率)。如果使用阻塞模式,有可能的问题:如果是桌面程序,你的程序可能会卡住无响应。如果你单独为connect开一个线程,可能加大资源消耗,特别是需要connect多个对象的时候。如果你使用线程池,非阻塞connect会导致线程处理效率下降。
  下面是个非阻塞connect的部分代码,使用select,至于pollepoll请自行搜索代码,跟非阻塞逻辑无关:intfd;。。。省略N行代码,socket的初始化,准备服务器信息等setnonblocking(fd);intretconnect(fd,(structsockaddr)servaddr,servlen);if(0ret){连接成功,直接进入正常业务逻辑}else{if(EINPROGRESS!errno){出错,结束close(fd);return;}EINPROGRESS继续判断}使用select对fd进行可写判断structtimevaltv;tv。tvsectimeout;tv。tvusec0;fdsetsets;FDZERO(sets);FDSET(fd,sets);retselect(fd1,NULL,wds,NULL,tv);if(ret0){if(FDISSET(fd,sets)){interr1;socklentlensizeof(int);retgetsockopt(fd,SOLSOCKET,SOERROR,err,len)if(ret0err){close(fd);return;}连接成功其实个人觉得如果可写后需要直接send,不需要getsockopt直接通过send也可以知道结果}}elseif(ret0){超时逻辑}else{select出错逻辑}

如何同步iPhone和Mac电脑的备忘录?我们都知道苹果的设备之间都有同步、甚至是接力等功能,更方便人们高效率的完成工作。那么,iPhone和Mac电脑的备忘录如何设置同步?1。点击偏好设置,2。然后点击i……入门4建立每天学习Web3的习惯刚刚找Web3。0行业的信息,不知道看什么。一般我来到星巴克学习的时候,首先是打开知识星球看84000里面有没有更新什么信息,今天打开发现没什么信息,我就在那里发呆想接下来干什……网络工程师需要具备哪些基本能力?网络工程师是通过学习和训练,掌握网络维护、设计、部署、运维、网络安全等技能。我就以一个企业的网络从无到有建设并逐渐完善的过程中来介绍一下网络工程师从中需要具备哪些基本能力?……燃油汽车PK新能源电动汽车,优势和劣势在哪儿?应该怎么选?燃油汽车PK新能源电动汽车,他们各组优势和劣势在哪儿?大家应该怎么选!经过经济的快速发展,现在每个家庭都有了车,或者在准备选择一台车。汽车成为了每家每户的必须品,那我们准……支持5G算啥?苹果iPhone13将支持卫星通讯,再也不会没手机信号太差,应该是iPhone近些年被诟病最多的问题了。以前大家怪英特尔不好用,可是用上了高通基带的iPhone12,信号依旧挺差的。iPhone13的信号会好一……腾讯音乐放弃独家版权!一个App或能听所有歌大家应该都听说了吧?腾讯宣布放弃音乐版权独家授权权利,将最大限度寻求与相关上游版权方尽快解除独家协议。消息一出,最为激动的不是用户,而是丁磊,立刻表示:希望(……科学家称黑洞的空间是扭曲的,那扭曲的空间是个什么样子的?所有大质量的天体都能将周围的时空弯曲,引力波的发现已经证实了爱因斯坦百年前的预言。而黑洞作为宇宙中质量最大的天体,它对时空的弯曲就更加让人不可思议。昨天,科学家们首……CardanoMetaverse项目Pavia的土地价格飙升游戏应用程序Pavia上周在Cardano网络上启动,成为区块链上第一个元界项目。在Pavia上发行了大约100,000个地块,每个都被铸造为具有单独坐标的独特的不可替代……高端手机与旗舰手机有什么不一样?1、要看手机好不好,售后服务不能少2、血战牛牛炸金花,电量首先不能慌3、美颜拍照得到位,不然礼物不到位4、后摄排列要疯狂,面子都靠它来扛5、原神吃鸡和王……南财研选国务院发文加快充换电基础设施建设,宁德时代发布换电方南方财经1月19日电,1月18日下午,宁德时代全资子公司时代电服,发布了换电服务品牌EVOGO及组合换电整体解决方案。据悉,此次宁德时代新推出的换电产品未来将会面向全部车企。有……oppo手机一般可以用几年?2016年换的0PP0用了一年半被外甥女在床上扔下来三次:修理没价值换新的,2019年春节又被她扔着玩摔了几次,又买新的2千2百元吧,这不三个年头(孩子大了)用起来某些地方出现……拼多多为何干不过淘宝?淘宝完蛋是早晚的事,前几天遇到的一件事彻底刷新了我对淘宝的认知,前几天在淘宝一家店铺定购了一份年刊月发的杂志,我和卖家沟通要求订购年刊,他明确告诉我每月15号会发两本给我,确定……
未进入全球前四,美国却自信推销自家5G技术,巴西已与华为合作为了打入全球通信行业的前四名,美国开挖中国墙角,却没想到遇上了中国技术的铁杆粉丝。世界灯塔化身推销员?一直以来美国都对自己各方面的发展自信满满,甚至在国际地位得到大幅提升……常见的纯电微型车,快来看一看,有你的座驾吗如今,随着科技的不断进步,新能源汽车越来越被人们所接受了。无论是油电混合动力,还是纯电动动力,一张绿牌,就能让你畅行无阻,再也不用担心限号问题了。国家的政策鼓励,固然是新……TPLINKXDR6070轻舟路由器发布2。5G网口双频8流IT之家8月15日消息TPLINK今年推出了众多WiFi6无线路由器系列,近日正式发布了轻舟系列XDR6070无线路由器新品,为AX6000规格,无线速率可达6000Mbps。……曝苹果汽车可能在加州设计在韩国组装2024年后登场汽车(AppleCar)是苹果最雄心勃勃的项目之一,虽然苹果试图不让关于苹果汽车制造的关键细节被泄露出来,但这并不意味着某些花絮不会传到网络上。8月10日,韩国的一篇报道……京东拍卖再现大额标的成交16。66亿元成功拍出知名半导体企业8月7日,民营初创企业荣芯半导体在京东拍卖以16。6616亿元成功获拍德淮半导体。这不仅是国内半导体市场的大事件,更是京东拍卖又一个超10亿元的大额成交标的。荣芯半导体以……2022小程序App和h5开发有什么区别?怎么选择?无论是大公司还是小创业公司,都会面临先做应用、小程序还是H5的困境,所有终端都是公司一起做的。对于大公司来说,他们可以同时一起发展,但是对于小公司来说,他们可能没有那么多……大数据,为何是贵州?应该说贵州终于又抓住了一个战略性的时代风口。如果说以茅台酒为首的酱香酒是一个历史性的机遇,归属于先天性,那么大数据这一风口则是人为的。为什么是贵州?大数据因其对安全的特殊要求,……RedmiNote10Pro超多高性能配置,能用三年RedmiNote10Pro终于发布了,我愿称他为一部性能与手机外形设计双重在线的一款手机,加上1499元起的价位,就算放在现在市场上,竞争比较激烈的中端手机中,其性能也是最强……华为折叠屏手机P50Pocket正式发布预计市场规模将爆发式12月23日下午,华为举办冬季旗舰新品发布会,正式发布了旗下首款纵向折叠手机HUAWEIP50Pocket。据介绍,HUAWEIP50Pocket采用上下折叠的设计,配合全新一……区块链世纪的新创造区块链,区块链技术的最早出现1991年。为了确保时间戳文件不被追溯及篡改,当时的两位科学家StuartHaber和W。ScottStornetta推出了一种实用计算的解决方案。……python(14)函数(1)写在前面的话:码字不易,点个赞关注一下作者再走吧〔呲牙〕1。定义函数defgreetuser():使用关键字def告诉python定义一个函数,并向python指出函数名……蒋凡卸任淘宝天猫董事长,现任海外业务总裁4月6日消息,有媒体报道,蒋凡已不再担任浙江淘宝网络有限公司、浙江天猫网络有限公司法定代表人、董事长兼总经理,不再担任阿里巴巴迅犀(杭州)数字科技有限公司的法定代表人及董事长。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网