- 1、本文档共444页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1.接收端 对于在一个无连接的套接字上接收数据来说,并不是很复杂。具体流程可表示如下: (1)初始化WinSock的动态连接库后,首先构造CSocket套接字对象,使用Creat函数创建数据报格式的套接字。 (2)通过Bind函数在将该套接字与准备接收数据的接口绑定在一起。 (3)使用Receive函数接收对方发送的数据,此时程序处于阻塞状态,直到接收到数据自动返回。 (4)接收数据完毕,使用Close函数关闭套接字。 2.发送端 在一个无连接的套接字上发送数据的具体流程可表示如下: (1)首先构造CSocket套接字对象,使用Creat函数创建数据报格式的套接字。 (2)通过Bind函数在将该套接字与准备发送数据的接口绑定在一起。 (3)使用Send函数向对方发送数据。 (4)发送完毕,使用Close函数关闭套接字。 14.2.2 主要功能函数介绍 前面已经介绍过,在MFC中,CAsyncSocket和CSocket类封装了Windows Sockets API函数。本节将结合套接字的创建和使用过程,介绍无连接通信中,使用的CAsyncSocket类的主要成员函数(CSocket类由CAsyncSocket类派生)。 1.WinSock环境的初始化 在使用WinSock MFC类之前,必须为应用程序初始化WinSock环境。其实现只要调用全局函数AfxSocketInit即可。如下面的代码: 同时,在“stdafx.h”文件中添加如下代码: 如果在使用MFC AppWizard[EXE创建MFC工程时,在MFC AppWizard Step 2对话框选择“Windows Sockets”选项,则程序回自动添加上面的代码,实现WinSock的初始化。 2.创建Socket 创建Socket,首先需要构造Socket对象,而后调用Create函数创建Socket。Create函数原型如下: 各参数含义如下: nSocketPort:为使用的端口号,默认为0,表示由系统自动选择,通常在客户端都使用这个选择。 nSocketType:为使用的协议族,默认为SOCK_STREAM,表示使用面向连接的流服务;为SOCK_DGRAM,表示使用无连接的数据报服务。 lpszSocketAddress:为本地的IP地址,可以使用点分法表示如“”。 2.创建Socket 也可以通过使用Bind函数设置Socket的地址和端口号,如下: 表示该Socket对象的地址为“168.0.1”,端口为4800。 通过Socket提供的send()和Receive()函数可以实现任何类型数据的发送和接收。 3. 发送、接收数据 通过Socket连接发送和接收数据比较简单。可以用Socket发送任何类型的数据,只需要一个指向存放数据的缓冲区指针即可。发送时,缓冲区存放待发送的数据;接收时,接收的数据将拷贝到缓冲区。 (1)发送数据 可以使用Send函数通过Socket连接发送数据,函数的原型如下: 各参数含义如下: lpBuf:指向发送数据缓冲区的指针,如果数据为CString变量,可使用LPCTSTR操作符把CString变量作为缓冲区传送。 nBufLen:指明缓冲区要发送数据的长度。 nFlags:该参数是可选的,用于控制消息的发送方式。 函数执行成功,返回发送到对方应用程序的数据总量。如果有错误产生,函数返回SOCKET_ERROR。 13.6.2 用户界面线程通信 (11)在【比较】按钮的消息响应函数中添加如下代码: (12)运行程序sample1303,结果如下图所示。 在运行程序时,单击【比较】按钮,并没有直接对a、b的值进行比较,而是发送一条WM_CPMPARE的消息,交由CCompareThread类的PreTranslateMessage()函数进行处理。 13.7 线程的同步 在编写多线程应用程序时,经常会出现线程间同步访问共享资源的情况。多个线程同时访问同一个共享资源将可能发生无法预知的错误。例如,一个线程正在更新数据集,而同时另外一个线程正在读取数据。那么,第二个线程只会读取一部分正确的数据。 为了解决这个问题,Visual C++6.0提供了同步类。同步类包括同步对象和同步访问对象。其中,同步对象分为4种,分别是CSemaphore(信号量)、CCriticalSection(临界区)、CMutex(互斥量)和CEvent(事件)。下面对这些同步类分别进行介绍。 13.7.1 同步访问对象 同步访问对象提供了对同步对象的封装。同步访问对象分为两种,分别是CSingleLock和CMultiLock。 1.CSingleLock 如果一次只需要等待一个同步对象,可以使用CSingleLock类的对象。CSin
文档评论(0)