Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)

上传人:鲁** 文档编号:490323716 上传时间:2022-10-09 格式:DOCX 页数:23 大小:70.02KB
返回 下载 相关 举报
Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)_第1页
第1页 / 共23页
Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)_第2页
第2页 / 共23页
Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)_第3页
第3页 / 共23页
Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)_第4页
第4页 / 共23页
Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)》由会员分享,可在线阅读,更多相关《Winsocket入门教程二:非阻塞式服务器和客户端程序(TCP)(23页珍藏版)》请在金锄头文库上搜索。

1、Winssockket入入门教程程二:非非阻塞式式服务器器和客户户端程序序(TCCP) 收藏 上上次为大大家介绍绍了阻塞塞式多线线程服务务端程序序和阻塞塞式客户户端程序序的设计计方法,但但是在上上文的最最后也提提到过,服服务器程程序会因因为建立立连接和和关闭连连接而频频繁的创创建和关关闭线程程会产生生大量的的内存碎碎片,从从而导致致服务端端程序不不能保证证长时间间的稳定定运行。因因此我在在这里为为大家介介绍另外外一种建建立服务务器和客客户端程程序的方方法,即即建立非非阻塞式式的服务务器和客客户端程程序。 那那什么是是非阻塞塞呢?非非阻塞是是相对于于阻塞而而言,阻阻塞指的的是在进进行一个个操作的

2、的时候,如如服务器器接收客客户端的的连接(accceptt),服服务器或或者客户户端读写写数据(reaad、wwritte),如如果该操操作没有有执行完完成(成成功或者者失败都都算是执执行完成成),则则程序会会一直阻阻塞在操操作执行行的地方方,直到到该操作作返回一一个明确确的结果果。而非非阻塞式式程序则则不一样样,非阻阻塞式程程序会在在产生阻阻塞操作作的地方方阻塞一一定的时时间(该该时间可可以由程程序员自自己设置置)。如如果操作作没有完完成,在在到达所所设置的的时间之之后,无无论该操操作成功功与否,都都结束该该操作而而执行程程序下面面的操作作。 为为了执行行非阻塞塞操作,我我们在创创建了一一个

3、套接接口后,需需要将套套接口设设置为非非阻塞的的套接口口。为了了将套接接口设置置成为非非阻塞套套接口,我我们需要要调用iiocttlsoockeet函数数将套接接口设置置为非阻阻塞的套套接口。iiocttlsoockeet函数数的定义义如下: iint iocctlssockket( SOOCKEETs, llonggcmdd, uu_loong FARR *arggp) 该该函数的的作用是是控制套套接口的的I/OO模式。 参参数s表表示要设设置的套套接口;参数ccmd表表示要对对该套接接口设置置的命令令,为了了要将套套接口设设置成为为非阻塞塞的,我我们应该该填写FFIONNBIOO;arrg

4、p表表示填写写命令的的值,如如我们要要将套接接口设置置成非阻阻塞的,我我们需要要将值设设置成为为1,如如果我们们要将套套接口设设置成为为非阻塞塞状态的的话,我我们将值值设置成成为0就就是了。 为为了进行行非阻塞塞的操作作,我们们需要在在进行操操作之前前调用sseleect函函数,sseleect函函数的定定义如下下: iint sellectt(innt nnfdss, ffd_sset FARR *reaadfdds, fd_sett FAAR *wriiteffds, fdd_seet FFAR *exccepttfdss, coonstt sttrucct ttimeevall FAAR

5、 *timmeouut); 该函数数设定一一个或多多个套接接口的状状态,并并进行必必要的等等待,以以便执行行异步II/0(非阻塞塞)操作作。 参数nnfdss被忽略略,该参参数的作作用仅仅仅是为了了与伯克克利套接接口相兼兼容;参参数reeadffds表表示要检检测的可可读套接接口的集集合(该该参数可可选,可可为设置置为NULLL);参数rreaddfdss表示要要检测的的可写套套接口的的集合(该参数数可选,可可为设置置为NUULL);参数数exccepttfdss表示要要检测的的套接口口的错误误(该参参数可选选,可为为设置为为NULLL);参数ttimeeoutt表示执执行该函函数时需需要等待

6、待的时间间,如果果为NUULL则则表示阻阻塞操作作,为00则表示示立即返返回。 下下面让我我们来看看看参数数类型ffd_sset,ffd_sset表表示套接接字的集集合。在在使用sseleect函函数时,我我们需要要将相应应的套接接字加入入到相应应的集合合中。如如果集合合中的套套接字有有信号,sseleect函函数的返返回值即即为集合合中有信信号的套套接字数数量。 我我们用下下面的几几个宏来来操作ffd_sset集集合。我我们可以以使用FFD_SSET(s, *sett)将套接接字s加加入到集集合seet中;我们可可以使用用FD_CLRR(s, *sett)将套接接字s移移除出集集合seet;

7、我我们可以以使用FFD_ZZEROO(*sset)将集合合sett清空;最后,我我们可以以使用FFD_IISSEET(ss, *sett)来判断断套接字字s是否否在集合合中有信信号。 接接下来再再让我们们来看看看sellectt函数的的三个集集合参数数reaadfdds、wwrittefdds以及及exccepttfdss。 rreaddfdss表示可可读套接接字的集集合,可可读套接接字在三三种情况况下有信信号出现现:一、如如果集合合中有套套接字处处于监听听状态,并并且该套套接字上上有来自自客户端端的连接接请求;二、如如果集合合中的套套接字收收到了ssendd操作发发送过来来的数据据;三、如如

8、果集合合中的套套接字被被关闭、重重置或者者中断。 wwrittefdds表示示可写套套接字的的集合,可可写套接接字在两两种情况况下有信信号出现现:一、集集合中的的套接字字经过cconnnectt操作后后,连接接成功;二、可可以用ssendd操作向向集合中中的套接接字写数数据。 eexceeptffds表表示错误误套接字字的集合合,错误误套接字字在两种种情况下下有信号号出现:一、集集合中的的套接字字经过cconnnectt操作后后,连接接失败;二、有有带外数数据到来来。 在在我们了了解了创创建服务务器和客客户端程程序的基基础知识识后,我我们再来来看看示示例程序序,以加加深我们们对知识识的理解解。

9、 程程序的运运行结果果如下所所示: 下下面是服服务器程程序的代代码: vieww pllainncoppy tto cclippboaardpprinnt?1. #inccludde 2. #inccludde 3. #inccludde 4. #inccludde 5. #praagmaacoommeent(libb,ws22_322.liib) 6. #deffineeASSSERRTaasseert 7. usinngsstd:ciin; 8. usinngsstd:coout; 9. usinngsstd:enndl; 10. usinngsstd:liist; 11. typeede

10、ffliistSSockketLListt; 12. typeedeffliist:iteerattorSocckettLisstItteraatorr; 13. statticconnstinttc_iPoort=1100001; 14. boollGrraceeCloose(SOCCKETT*pps); 15. intmaiin() 16. 17. inttiRRet=SSOCKKET_ERRROR; 18. /初始化化Winnsocckett,所有有Winnsocckett程序必必须先使使用WSSASttarttup进进行初始始化 19. WSAADATTAddataa; 20. Zer

11、roMeemorry(&datta,sizzeoff(WSSADAATA); 21. iReet=WSSASttarttup(MAKKEWOORD(2,0),&ddataa); 22. ASSSERTT(SOOCKEET_EERROOR!=iiRett); 23. /建立服服务端程程序的监监听套接接字 24. SOCCKETTskkLisstenn=INVVALIID_SSOCKKET; 25. skLListten=ssockket(AF_INEET,SOCCK_SSTREEAM,0); 26. ASSSERTT(INNVALLID_SOCCKETT!=skkLisstenn); 27. /

12、初始化化监听套套接字地地址信息息 28. socckadddr_inadrrSerrv;/表表示网络络地址 29. ZerroMeemorry(&adrrSerrv,sizzeoff(soockaaddrr_inn); 30. adrrSerrv.ssin_fammilyy=AAF_IINETT;/初初始化地地址格式式,只能能为AFF_INNET 31. adrrSerrv.ssin_porrt=hhtonns(cc_iPPortt);/初初始化端端口,由由于网络络字节顺顺序和主主机字节节顺序相相反,所所以必须须使用hhtonns将主主机字节节顺序转转换成网网络字节节顺序 32. adrrSe

13、rrv.ssin_adddr.ss_adddr=IINADDDR_ANYY;/初初始化IIP,由由于是服服务器程程序,所所以可以以将INNADDDR_AANY赋赋给该字字段,表表示任意意的IPP 33. /绑定监监听套接接字到本本地 34. iReet=biind(skLListten,(ssockkadddr*)&addrSeerv,siizeoof(ssockkadddr_iin); 35. ASSSERTT(SOOCKEET_EERROOR!=iiRett); 36. /使用监监听套接接字进行行监听 37. iReet=liisteen(sskLiisteen,FD_SETTSIZZE);/SOOMAXXCONNN表示示可以连连接到该该程序的的最大连连接数 38. ASSSERTT(SOOCKEET_EERROOR!=iiRett); 39. couutSerrverrbeegannliisteeninng.enddl; 40. /将套接接口从阻阻塞状态态设置到到费阻塞塞状态 41. unssignnedlonnguulEnnablle=1; 42

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 市场营销

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号