第4章-MFCWinSock类的编程

上传人:公**** 文档编号:567925017 上传时间:2024-07-22 格式:PPT 页数:50 大小:1.31MB
返回 下载 相关 举报
第4章-MFCWinSock类的编程_第1页
第1页 / 共50页
第4章-MFCWinSock类的编程_第2页
第2页 / 共50页
第4章-MFCWinSock类的编程_第3页
第3页 / 共50页
第4章-MFCWinSock类的编程_第4页
第4页 / 共50页
第4章-MFCWinSock类的编程_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《第4章-MFCWinSock类的编程》由会员分享,可在线阅读,更多相关《第4章-MFCWinSock类的编程(50页珍藏版)》请在金锄头文库上搜索。

1、第第4 4章章 MFC WinSock MFC WinSock类的编程类的编程l4.1 CAsyncSocket类l4.2 CSocket类l4.3 CAsyncSocket类应用实例缴苦拐飘捎窿敲郑铭瞻情候泻平蛇共簧栈割凤锄雇魁钧咒妨罗灾芬引追凝第4章MFCWinSock类的编程第4章MFCWinSock类的编程为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的MFC,提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows Socket网络通信程序,提供了两种编程模式。 均寸熊稍腻打庐寡楼妒漫胁省林窿牺讨陪羡青化垂纪际

2、窝豪汹琢爹愁乏匆第4章MFCWinSock类的编程第4章MFCWinSock类的编程Sockets Programming Models Based MFCThe two MFC Windows Sockets programming models are supported by the following classes: lCAsyncSocketThis class encapsulates the Windows Sockets API. CAsyncSocket is for programmers who know network programming and want the

3、 flexibility of programming directly to the sockets API but also want the convenience of callback functions for notification of network events. Other than packaging sockets in object-oriented form for use in C+, the only additional abstraction this class supplies is converting certain socket-related

4、 Windows messages into callbacks. lCSocket脊摊泪朽为驰抨蔑淤仅皿誊哪粹执扬粮冬旱藕孕泼萍迸保称再蒙浓嗓乾讨第4章MFCWinSock类的编程第4章MFCWinSock类的编程在很低的层次上对WindowsSocketsAPI进行了封装。 它的成员函数和WindowsSocketsAPI的函数调用直接对应。一个一个CAsyncSocket对象代表了一个对象代表了一个Windows套接字套接字。它是网络网络通信的端点通信的端点。除了把套接字封装成C+的面向对象的形式供程序员使用以外,这个类唯一所增加的抽象就是将那些与套接字相关的将那些与套接字相关的Wind

5、ows消息变为消息变为CAsyncSocket类的回类的回调函数调函数。 CAsyncSocket类类知鄂扔宛滦到釉硬恕续蜕藩前丘砰梅弊怀忌训掀揖骡米馋党共嫌豫际拄坚第4章MFCWinSock类的编程第4章MFCWinSock类的编程Sockets Programming Models Based MFClCSocketThis class, derived from CAsyncSocket, supplies a higher level abstraction for working with sockets through an MFC CArchive object. Using a

6、 socket with an archive greatly resembles using MFCs file serialization protocol. This makes it easier to use than the CAsyncSocket model. CSocket inherits many member functions from CAsyncSocket that encapsulate Windows Sockets APIs; you will have to use some of these functions and understand socke

7、ts programming generally. But CSocket manages many aspects of the communication that you would have to do yourself using either the raw API or class CAsyncSocket. Most importantly, CSocket provides blocking (with background processing of Windows messages), which is essential to the synchronous opera

8、tion of CArchive. 焊方擅凄抱褒剂捕句竖词燥弯遣茄岁小纯村芜虑斤茄挡逼笋络领祭砌夏秤第4章MFCWinSock类的编程第4章MFCWinSock类的编程从 CAsyncSocket类 派 生 , 是 对 WindowsSockets API的 高 级 封 装 。 CSocket类 继 承 了CAsyncSocket类的许多成员函数,用法一致。CSocket类的高级表现在三个方面:(1)CSocket结合结合archive类来使用套接字类来使用套接字。(2)CSocket管理了通信的许多方面,如字节顺序问题和字符串转换问题。 (3)CSocket类为Windows消息的后台处理提

9、供了阻塞的工作模式阻塞的工作模式。 CSocket类类磅航横腋顿道企婶塔羡苫榜翔缓雌乎巢徽敛寄掺避彼证郎嘻粹叉悠南雷甸第4章MFCWinSock类的编程第4章MFCWinSock类的编程 这两个类提供了事件处理函数,编编程程者者通通过过对对事事件件处处理理函函数数进进行行重重载载,可可方方便便地地对对套套接接字字发发送送数数据据、接接收收数数据据等等事事件件进进行行处处理理。同时,可可以以结结合合MFC的的其其它它类类来来使使用用这这两两个个套套接接字字类类,并利用MFC的各种可视化向导,从而大大简化了编程。 在MFC中,有一个名为afxSock.h的包含文件,在这个文件中定义了CAsyncS

10、ocket,CSocket,和CSocketFile这三个套接字类。 Afxsock.h靖耗迁料是奇耗欣戏裔苫夏翟圣祟资胃浑焚量赘烩稻乱票摊趟掸麦工榔叙第4章MFCWinSock类的编程第4章MFCWinSock类的编程4.1 CAsyncSocket类类l4.1.1 创建创建CAsyncSocket类对象类对象l4.1.2 关于关于CAsyncSocket类可以接受并处理的类可以接受并处理的消息事件消息事件l4.1.3 客户端套接字对象请求连接到服务器端客户端套接字对象请求连接到服务器端套接字对象套接字对象l4.1.4 服务器接受客户机的连接请求服务器接受客户机的连接请求l4.1.5 发送与

11、接收流式数据发送与接收流式数据l4.1.6 关闭套接字关闭套接字l4.1.7 错误处理错误处理l4.1.8 其他函数其他函数康芳瑰篡铸娩敞苟桥恫扬讥平伴佛莹柬履斤旨户晕轰谭晨计铬淘原网土联第4章MFCWinSock类的编程第4章MFCWinSock类的编程CAsyncSocket类从Cobject类派生而来,如图4.1所示: 图4.1CAsyncSocket类的派生关系 CAsyncSocket类的派生关系类的派生关系 联住长党嫌四砖喉伯孪搭渭创娇厩载了海教烙毖颈午猜缮只湛腾结郁添雅第4章MFCWinSock类的编程第4章MFCWinSock类的编程本课程将CAsyncSocket类对象称为异

12、异步步套套接接字字对对象象。创建异步套接字对象一般分为两个步骤,首先构造一个CAsyncSocket对象,再创建该对象的底层的SOCKET句柄。1创建空的异步套接字对象创建空的异步套接字对象 通过调用CAsyncSocket类的构造函数,创建一个新的空CAsyncSocket类套接字对象,构造函数不带参数。然后必须调用它的Create成员函数,来创建底层的套接字数据结构,并绑定它的地址。 4.1.1 创建创建CasyncSocket类对象类对象色赵讯泌贴纶伦琶迭索鳞尸娃溯怯讯庶呸幸牌章讫耀堕堆湾傣帧另邪硼氨第4章MFCWinSock类的编程第4章MFCWinSock类的编程有两种使用方法,会在

13、不同的位置创建。(1)如:CAsyncSocketasock;asock.Create();(2)如:CAsyncSocket*pa;pa =newCAsyncSocket;pa -Create(); 炊瘴濒炮良拽侧黑啮莽溪磋坝浮堂药脚榆多秃汁伙阵臻拼瘦菌竣当滦嗽渊第4章MFCWinSock类的编程第4章MFCWinSock类的编程 通过调用CAsyncSocket类的Create()成员函数,创建该对象的底层套接字句柄,决定套接字对象的具体特性。调用格式为:BOOLCreate(UINTnSocketPort=0,IntnSocketType=SOCK_STREAM,LongIevent=F

14、D_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL); 2创建异步套接字对象的底层套接字句柄创建异步套接字对象的底层套接字句柄留歪馅溜兜催泻旬巧料痰湍醉宁阜侨傅骏倒柱晤庐忆格揪苑橙镜堵锁此萨第4章MFCWinSock类的编程第4章MFCWinSock类的编程举例:创建一个使用27端口的流式异步套接字对象。CAsyncSocket*pSocket=newCAsyncSocket;intnPort=27;pSocket-Create(nPort,SOCK_STREAM); 创建异步套接

15、字举例创建异步套接字举例揉伦雨翱滦腕拓幕瘦甚悸茧驯娱扦丫赣谋痕子回腺讼抡哑惶袖群巨外臃蜕第4章MFCWinSock类的编程第4章MFCWinSock类的编程1六种套接字相关的事件与通知消息六种套接字相关的事件与通知消息参数Ievent可以选用的六个符号常量是在winsock.h文件中定义的。#defineFD_READ0x01#defineFD_WRITE0x02#defineFD_OOB0x04#defineFD_ACCEPT0x08#defineFD_CONNECT0x10#defineFD_CLOSE0x20 4.1.2 关于关于CAsyncSocket类可以接受并处理的类可以接受并处理

16、的消息事件消息事件嗜蚀擦埃失孺清戳炭毡文奈展匈踊甩蚜蘸押孟扛湘打僳婆子贾始员红那的第4章MFCWinSock类的编程第4章MFCWinSock类的编程他们代代表表MFC套套接接字字对对象象可可以以接接受受并并处处理理的的六六种种网网络络事事件件,当当事事件件发发生生时时,套套接接字字对对象象会会收收到到相相应应的的通通知知消消息息,并并自自动动执执行行套套接接字字对对象象响响应应的的事事件处理函数件处理函数。(1)FD_READ事件通知:通知有数据可读有数据可读。(2)FD_WRITE事件通知:通知可以写数据可以写数据。(3)FD_ACCEPT事件通知:通知监听套接字有有连接请求可以接受连接请

17、求可以接受。(4)FD_CONNECT事件通知:通知请求连接的套接字,连接的要求已被处理(连接的要求已被处理(但不一定是被接受但不一定是被接受)。(5)FD_CLOSE事件通知:通知套接字已关闭套接字已关闭。(6)FD_OOB事件通知:通知将有带外数据到达有带外数据到达。 吭远巷氖咽涎氰咖瞥残猾魏溯巨邹贮辞街痔唁艺婉委坍写估据郴宪暖买廉第4章MFCWinSock类的编程第4章MFCWinSock类的编程2MFC框架对于六个网络事件的处理框架对于六个网络事件的处理当上述的网络事件发生时,MFC框架作何处理呢?按照Windows的消息驱动机制,MFC框架应当把消息发送给相应的套接字对象,并调用作为

18、该对象成员函数的事件处理函数。事件与处理函数是一一映射的。 妙腊漓唱究慑旷靡沾央淋忍姬侠葬哈簇窥陀威喘郑懊郁耽腹拜孙根衣拌粪第4章MFCWinSock类的编程第4章MFCWinSock类的编程在afxSock.h文件中的CAsyncSocket类的声明中,定义了与这六个网络事件对应的事件处理函数。virtual void OnReceive(int nErrorCode); 对应FD_READ事件virtualvoidOnSend(intnErrorCode);对应FD_WRITE事件virtualvoidOnAccept(intnErrorCode);对应FD_ACCEPT事件virtual

19、voidOnConnect(intnErrorCode);对应FD_CONNECT事件齿入挠锨民司首满鄂个慢姿栽戊嗣至旨置潍矩轨习帜钝悯番苹釜虱狱淆太第4章MFCWinSock类的编程第4章MFCWinSock类的编程virtualvoidOnClose(intnErrorCode);对应FD_CLOSE事件virtualvoidOnOutOfBandData(intnErrorCode);对应FD_OOB事件 当某个网络事件发生时,MFC框架会自动调用套接字对象的对应的事件处理函数。这就相当给了套接字对象一个通知,告诉它某个重要的事件已经发生。所以也称之为套接套接字类的通知函数字类的通知函数

20、(notification functions)或)或回调函数回调函数(callback functions)。 永灸嫂甫内蔬缝难经茧佛相绸粟钙蟹赤慧彪酌谁腮扔玉让冗束栅裴魂控熏第4章MFCWinSock类的编程第4章MFCWinSock类的编程3重载套接字对象的回调函数重载套接字对象的回调函数如果你从CAsyncSocket类派生了自己的套接字类,你必须重载你的应用程序所感兴趣的那些网络事件所对应的通知函数。MFC框架自动调用通知函数,使得你可以在套接字被通知的时候来优化套接字的行为。 猩且聂米调搐桂苍逐醉袭漂透沉拇砖纪当置藉樱溺氧镶如姓屈竭疑瞎携厨第4章MFCWinSock类的编程第4章M

21、FCWinSock类的编程 在服务器端套接字对象已经进入监听状态 之 后 , 客 户 应 用 程 序 可 以 调 用CAsyncSocket类的Connect()成员函数,向服务器发出一个连接请求, 格式一:BOOL Connect(LPCTSTRlpszHostAddress,UINTnHostPort); 格 式 二 : BOOL Connect( const SOCKADDR*lpSockAddr,intnSockAddrLen); 4.1.3 客户端套接字对象请求连接到服务器端客户端套接字对象请求连接到服务器端套接字对象套接字对象铡丸挑秦墓祖阮硷屡惕渴美低佳千藻肇蓄叮揍捣怖滓堡代腥量盼

22、钠确屁吧第4章MFCWinSock类的编程第4章MFCWinSock类的编程 如 果 调 用 成 功 或 者 发 生 了WSAEWOULDBLOCK错误,当调用结束返回时,都会发生FD_CONNECT事件,MFC框架会自动调用客户端套接字的OnConnect()事件处理函数,并将错误代码作为参数传送给它。它的原型调用格式如下,virtualvoidOnConnect(intnErrorCode); 焦绚淄松俐券刊劫粱累合慧擦艰梨锭观版獭辟荒吧棠沉并屑逝讹执综扶斑第4章MFCWinSock类的编程第4章MFCWinSock类的编程在服务器端,使用CAsyncSocket流式套接字对象,一般按照以

23、下步骤来接收客户端套接字对象的连接请求。(1)服务器应用程序必须首先创建一个创建一个CAsyncSocket流式套接字对象流式套接字对象,并调用它的Create成员函数创建底层套接字句柄。这个套接字对象专门用来监听来自客户机的连接请求,所以称它为监听套接字对象监听套接字对象。 4.1.4 服务器接受客户机的连接请求服务器接受客户机的连接请求延臻顿尤轨紧抿赃裹膛镇鲤掳闲澳烂韭潜驴诽蹬瘪焙京季赖杠妄胆件忻狂第4章MFCWinSock类的编程第4章MFCWinSock类的编程(2)调调用用监监听听套套接接字字对对象象的的Listen成成员员函函数数,使监听套接字对象开始监听来自客户端的连接请求。此函

24、数的调用格式是:BOOLListen(intnConnectionBacklog=5);当Listen函数确认并接纳了一个来自客户端的连接请求后,会触发FD_ACCEPT事件,监听套接字会收到通知,表示监听套接子已经接纳了一个客户的连接请求,MFC框架会自动调用监听套接字的OnAccept事件处理函数,它的原型调用格式如下,virtualvoidOnAccept(intnErrorCode); 编程者一般应重载此函数,在其中调用监听套接字编程者一般应重载此函数,在其中调用监听套接字对象的对象的Accept函数,来接收客户端的连接请求函数,来接收客户端的连接请求。 奎怒诲各戏涸性谐锈搞执朵荣材俺

25、砷妆忙投现次咙坎蹲韩番夺颖许尼曙宰第4章MFCWinSock类的编程第4章MFCWinSock类的编程(3)创建一个新的空的套接字对象,不需要使用它的Create函数来创建底层套接字句柄。这个套接字专门用来与客户端连接,并进行数据的传输。一般称它为连连接接套套接接字字,并作为参数传递给下一步的Accept成员函数。(4)调用监听套接字对象的Accept成员函数,调用格式为:virtualBOOLAccept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL);俏栖茬伦榆任喜绞镣出耙冉唤滚太

26、庸邱旷捎囊少挂称枯搂撼威痞痈介恼谊第4章MFCWinSock类的编程第4章MFCWinSock类的编程 当服务器和客户机建立了连接以后,就可以在服务器端的连接套接字对象和客户端的套接字对象之间传输数据了。对于流式套接字对象,使用CAsyncSocket类的Send成员函数向流式套接字发送数据,使用Receive成员函数从流式套接字接收数据。 4.1.5 发送与接收流式数据发送与接收流式数据土憎纤恤肿呵姬铬再吝意咆焕澳告癌问湘耐眩好拱童戊鄙吟闯栅芯商辽硕第4章MFCWinSock类的编程第4章MFCWinSock类的编程1用用Send成员函数发送数据成员函数发送数据格式:virtualintSe

27、nd(constvoid*lpBuf,intnBufLen,intnFlags=0); 对于一个CAsyncSocket套接字对象,当 它 的 发 送 缓 冲 区 腾 空 时 , 会 激 发FD_WRITE事件,套接字会得到通知,MFC框架会自动调用这个套接字对象的OnSend事事件件处处理理函函数数。一般编程者会重载这个函数,在其中调用Send成员函数来发送数据。 票蜀晃可吻牢旅噎拼疥营终蔫圆雅穷塔日孽旁鄙躲纤扑孪佣初咎釜窖拼敲第4章MFCWinSock类的编程第4章MFCWinSock类的编程2用用Receive成员函数接收数据成员函数接收数据格式:VirtualintReceive(Vo

28、id*lpBuf,IntnBufLen,IntnFlags=0); 对于一个CAsyncSocket套接字对象,当有数据到达它的接收队列时,会激发FD_READ事件,套接字会得到已经有数据到达的通知,MFC框架会自动调用这个套接字对象的OnReceive事件处理函数。一般编程者会重载这个函数,在其中调用Receive成员函数来接收数据。在应用程序将数据取走之前,套接字接收的数据将一直保留在套接字的缓冲区中。 沿衔渭舌熟褪展违竿土寐碗僧酒脾纂鸯映狮睡业苹饿霹技缉路彝隐眼斩崔第4章MFCWinSock类的编程第4章MFCWinSock类的编程1使用使用CAsyncSocket类的类的Close成员

29、函数成员函数格式:virtualvoidClose();2使使用用CAsyncSocket类类的的ShutDown()成成员员函数函数 使用CAsyncSocket类的ShutDown()成员函数,可以选择关闭套接字的方式。将套接字置为不能发送数据,或不能接收数据,或二者均不能的状态。格式:BOOLShutDown(intnHow=sends); 4.1.6 关闭套接字关闭套接字婿拳孔楷献煤纤射热掣挑举掌洁恭杠初鹿计歧圆剪钨饲粳把厄著拧庚逛鱼第4章MFCWinSock类的编程第4章MFCWinSock类的编程一般说来,调用CAsyncSocket对象的成员函数后,返回一个逻辑型的值,如果成员函

30、数执行成功,返回TRUE;如果失败,返回FALSE。究竟是什么原因 造 成 错 误 呢 ? 这 时 , 可 以 进 一 步 调 用CAsyncSocket对象的GetLastError()成员函数,来获取更详细的错误代码,并进行相应的处理。格式:staticintGetLastError();返回值是一个错误码,针对刚刚执行的CAsyncSocket成员函数。 4.1.7 错误处理错误处理攫肤茁来依窖莆牙跳极测枚沼叹分某悔啮离窿天深乃睛扼杭狸蛇均帐湿敖第4章MFCWinSock类的编程第4章MFCWinSock类的编程1关于套接字属性的函数关于套接字属性的函数要设置底层套接字对象的属性,可以调

31、用SetSocketOpt()成员函数;要 获 取 套 接 字 的 设 置 信 息 , 可 调 用GetSocketOpt()成员函数;要控制套接字的工作模式,可调用IOCtl()成员函数,选择合适的参数,可以将套接字设置在阻塞模式(Blockingmode)下工作。 4.1.8 其它的成员函数其它的成员函数挟跟著憎木扛策滔忿毒坏涎竹磐隐劫侠澳蛊吹致溪科肉顾骸帚百锯转渴惭第4章MFCWinSock类的编程第4章MFCWinSock类的编程2发送和接收数据发送和接收数据如果创建的是数据报类型的套接字,用SendTo()成员函数来向指定的地址发送数据,事先不需要建立发送端和接收端之间的连接,用Re

32、ceiveFrom()成员函数可以从某个指定的网络地址接收数据。 蛛落世宏气均玲抵桂骨涂失角坝俐岩缓地怎滨诽垄晶哆迫以忿屋灯扛煎空第4章MFCWinSock类的编程第4章MFCWinSock类的编程发送数据SendTo的调用格式,有两种重载的形式,区别在于参数不同:intSendTo(constvoid*lpBuf,intnBufLen,UINTnHostPort,LPCTSTRlpszHostAddress=NULL,intnFlags=0);intSendTo(constvoid*lpBuf,intnBufLen,constSOCKADDR*lpSockAddr,intnSockAddrL

33、en,intnFlags=0);搭莎朴柿辛负榆坦沽筑椿杰梦卵碾翘臭砸馈搐我宛料涡谁胞闻令芒狮抄癣第4章MFCWinSock类的编程第4章MFCWinSock类的编程接收数据ReceiveFrom的调用格式,也有两种重载的形式,区别在于参数不同:intReceiveFrom(void*lpBuf,intnBufLen,CString&rSocketAddress,UINT&rSocketPort,intnFlags=0);intReceiveFrom(void*lpBuf,intnBufLen,SOCKADDR*lpSockAddr,int*lpSockAddrLen,intnFlags=0);

34、 舞俘坛逊锅关盼服铁涯馅算俩鼻剑周体侧缄舷婚田恶骸修粳皇拱参跑渡拥第4章MFCWinSock类的编程第4章MFCWinSock类的编程4.2 CSocket类类l4.1.1 创建创建CSocket对象对象l4.1.2 建立连接建立连接l4.1.3 发送和接收数据发送和接收数据l4.1.4 CSocket类与类与CArchive类和类和CSocketFile类类l4.1.5 发送与接收流式数据发送与接收流式数据l4.1.6 关闭套接字和清除相关的对象关闭套接字和清除相关的对象l4.1.8 CSocket类的编程模型类的编程模型辞兰沈予硫澡诊橡氰笋磐胰橱碌矗迄褥狂既鹊林致柞颧紧近守栖琵枫类是第4章

35、MFCWinSock类的编程第4章MFCWinSock类的编程CSocket类是从CAsyncSocket类派生而来的,它们的派生关系如图4.2: 图4.2CSocket类的派生关系 仲宇姥索读场玉咆校轻曙礁闽阮汞今有艺炙墙质助径捍争协殉骗很叫则刷第4章MFCWinSock类的编程第4章MFCWinSock类的编程分为两个步骤:(1)调用CSocket类的构造函数,创建一个空的CSocket对象。(2)调用此CSocket对象的Create()成员函数,创建对象的底层套接字。调用格式是:BOOLCreate(UINTnSocketPort=端口号,IntnSocketPort=SOCK_STR

36、EAM|SOCK_DGRAM,LPCTSTRlpszSocketAddress=套接字所用的网络地址套接字所用的网络地址); 如果打算使用如果打算使用CArchive对象和套接字一起进行数据传输对象和套接字一起进行数据传输工作,必须使用流式套接字工作,必须使用流式套接字。 4.2.1 创建创建CSocket对象对象岸磁座让粱檀幽庸善咏匠搬真焕川揩矽宅呆跟际陶寐乎艇已帜暑干粮碳沽第4章MFCWinSock类的编程第4章MFCWinSock类的编程CSocket类使用基类CAsyncSocket的同名成员函数Connect()、Listen()、Accept()来建立服务器和客户机套接字之间的连接

37、,使用方法相同。不不同同的的是是:CSocket类类的的Connect()和和Accept()支支持持阻阻塞塞调调用用。比如:在调用Connect()函数时会发生阻塞,直到成功地建立了连接或有错误发生才返回,在多线程的应用程序中,一个线程发生阻塞,其他的线程仍能处理Windows事件。CSocket对象从不调用OnConnect()事件处理函数。 4.2.2 建立连接建立连接于六灵剁幅遵盟缸门圈阁灯含赃咙工仿黍钥蔓袁剑块借蛤尉瞬担氓式蚁即第4章MFCWinSock类的编程第4章MFCWinSock类的编程在创建CSocket类对象后,对于数据报套接字,直接使用CSocket类的SendTo()

38、、ReceiveFrom()成员函数来发送和接收数据。对于流式套接字,首先在服务器和客户机之间建立连接,然后使用CSocket类的Send()、Receive()成员函数来发送和接收数据,它们的调用方式与CAsyncSocket类相同。不不同同的的是是:CSocket类类的的这这些些函函数数工工作作在在阻阻塞塞的的模模式式。比如,一旦调用了Send()函数,在所有的数据发送之前,程序或线程将处于阻塞的状态。一一般般将将CSocket类类与与CArchive类类和和CSocketFile类类结结合合,来来发发送送和和接接收收数数据据,这这将将使使编编程程更更为为简简单。单。CSocket对象从不

39、调用OnSend()事件处理函数。 4.2.3 发送和接收数据发送和接收数据塌汰狭石攒旦弄跋席磷辐舰杠矿拾辞鞋绞渤煮岗骏堡妹卑你变伴肉辕蛛蔫第4章MFCWinSock类的编程第4章MFCWinSock类的编程使使用用CSocket类类的的最最大大优优点点在在于于,应应用用程程序序可可以以在在连连接接的的两两端端通通过过CArchive对对象象来来进进行行数数据据传传输输。具体做法是:(1)创建CSocket类对象(2)创建一个基于CSocketFile类的文件对象,并把它的指针传给上面的已创建的CSocket对象。(3)分别创建用于输入和输出的CArchive对象,并将它们与这个CSocket

40、File文件对象连接。(4)利用CArchive对象来发送和接收数据。 4.2.4 CSocket类与类与CArchive类类和和CSocketFile类类沛蝗握临分孔偶直盯盐势京粗衙喉郧篡慕桅俏亡磐缴附嚏谤郑喘静即苔铰第4章MFCWinSock类的编程第4章MFCWinSock类的编程CSocketexSocket;/创建一个空的CSocket对象。CSocketFile*pExFile;/定义一个CSocketFile对象指针。CArchive*pCArchiveIn;/定义一个用于输入的Carchive对象指针。CArchive*pCArchiveOut;/定义一个用于输出的Carchi

41、ve对象指针。exSocket.Create();/创建Csocket对象的底层套接字。 示例代码示例代码庶明线扩懒捂音梧接梢宣篓哪兆团芜票忻纸钮仅刨好何凛冶理裴钠榔惋剑第4章MFCWinSock类的编程第4章MFCWinSock类的编程/创建CSocketFile对象,并将CSocket对象的指针传递给它。pExFile = new CSocketFile( & exSocket,TRUE);/创建用于输入的CArchive对象pCArchiveIn=newCArchive(pExFile,CArchive:load);/创建用于输出的CArchive对象。pCArchiveOut=newC

42、Archive(pExFile,CArchive:store);迁夺材胎百孵榴挟此氮呢鸿涩艺迎枷菩辈纷昆疹俄容恨呛患烁凝亚铲寞扼第4章MFCWinSock类的编程第4章MFCWinSock类的编程图4.3CSocket、CArchive和CSocketFile类在传输数据时的作用 会靳眼昭暴躲朗谍哟众癣锌驻倦耐砰始砒季邀介嘿踌婆酣簿酚焙英贞函子第4章MFCWinSock类的编程第4章MFCWinSock类的编程在使用完CSocket对象以后,应用程序应调用它的Close()成员函数来释放套接字占用的系统资源,也可以调用它的ShutDown()成员函数来禁止套接字读写。而对于相应的CArchiv

43、e对象、CSocketFile对象和CSocket对象,可以将它们销毁;也可以不作处理,因为当应用程序终止时,会自动调用这些对象的析构函数,从而释放这些对象占用的资源。 4.2.5 关闭套接字和清除相关的对象关闭套接字和清除相关的对象破爆源酥劲户未钩慢氖赖乾汗苯茎瘫吴贬问娄佬毡狐泥捂己烧独婿肄赌房第4章MFCWinSock类的编程第4章MFCWinSock类的编程1服务器端服务器端(1)CSocketsockServ;/创建空的服务器端监听套接字对象。/用众所周知的端口,创建监听套接字对象的底层套接字句柄。(2)sockServ.Create(nPort);(3)sockServ.Listen

44、();/启动对于客户端连接请求的监听。(4)CSocketsockRecv;/创建空的服务器端连接套接字对象。 4.2.6 CSocket类的编程模型类的编程模型极户墩粒奶滨磺壹蚊跑蜕诺陪茵穷樱价耶耸牡蓟伪墓财敝与阎球屁潘素玲第4章MFCWinSock类的编程第4章MFCWinSock类的编程/接收客户端的连接请求,并将其他的任务转交给连接套接字对象。sockServ.Accept(sockRecv);(5)CSockFile*file;file=newCSockFile(&sockRecv);/创建文件对象并关联到连接套接字对象。(6)CArchive*arIn,arOut;arIn=CAr

45、chive(&file,CArchive:load);/创建用于输入的归档对象,arOut=CArchive(&file,CArchive:store);/创建用于输出的归档对象。/归档对象必须关联到文件对象。脾寝佩染揖妓拭坦赏小斋锋薄瀑缨佩穴认是揖肿沼弓反净械鲜嗡佯扔丁离第4章MFCWinSock类的编程第4章MFCWinSock类的编程(7)arIndwValue;/进行数据输入。adOutdwValue;/进行数据输入。adOutdwValue;/进行数据输出。输入或输出可以反复进行。(7)sockClient.Close();/传输完毕,关闭套接字对象。 慢扰殊蛙洱帅峦玛凝玻逞梳绳坷朽

46、珊遂辊改揭仟约腾蒙垒打绊做谨袜计形第4章MFCWinSock类的编程第4章MFCWinSock类的编程4.3 实实 例例 分分 析析lSocket Programming with MFC.doclSending & Receiving UDP Datagrams with MFCs CAsyncSocket C+ Class.doc奢产氯巾刑矣围眼苫铣妙滞蚜坚囚席缸朴票骗速防票哲换忱犁晚俗传崔个第4章MFCWinSock类的编程第4章MFCWinSock类的编程作作 业业l针对课堂上所讲流式套接字和数据报套接字针对课堂上所讲流式套接字和数据报套接字编程实例,在编程实例,在.Net 2005环境下进行编程:环境下进行编程:编写基于编写基于CAsyncSocket的流式套接字客户的流式套接字客户端程序和端程序和UDP发送、接收程序,将主要模发送、接收程序,将主要模块架构、工作流程及核心代码注释进行编块架构、工作流程及核心代码注释进行编档作为作业上交。档作为作业上交。稽惮馒疟堤利难怜磺业素海圭祭滚虚哉并邢惹警写汾矗皮俐仙蹄爽愉瘸辗第4章MFCWinSock类的编程第4章MFCWinSock类的编程

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

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