C++MFC基础教程(初学者)题库.ppt

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。 3. 发送、接收数据 (2)接收数据 Socket接收数据时,就需要调用Receive函数。Receive函数原型如下: Receive函数的参数与Send函数基本相同,lpBuf为缓冲区指针,指明接收数据存储的位置,参数nBufLen是缓冲区的长度,指示Socket能存储多少数据。nFlags为标记位,收发双方需要指明相同的标记。 执行成功后,Receive函数也返回接收到的数据的数据量。如果有错误产生,函数返回SOCKET_ERROR。 3. 发送、接收数据 有一点需要说明,在接收数据时,最后一个字符后面最好设置一个NULL字。因为缓冲区中可能会有一些垃圾数据,如果接收的数据后面不加NULL,应用程序可能会把这些垃圾数据作为接收数据的一部分。如下面的实现代码: 对于无连接通信,即数据报类型的Socket,发送和接收数据还可以使用SendTo和ReceiveFrom函数,其功能和使用与Send和Receive函数基本相同。 4. 关闭Socket连接 当应用程序完成与对端的所有通信之后,就可以调用Close函数关闭这次连接。Close函数不带任何参数,调用方式如下: 有时可能需要在Socket关闭之前就让其停止运行,这时可调用Shutdown函数。Shutdown函数原型如下: 4. 关闭Socket连接 该函数只需要一个整形参数nHow,指明是否关闭此Socket数据的发送或接收,如下表所示。 需要注意的是,调用Shutdown函数并不关闭网络连接,也不能释放Socket所占用的任何资源,程序完成后,仍然需要调用Close函数关闭Socket。 13.7 线程的同步 在编写多线程应用程序时,经常会出现线程间同步访问共享资源的情况。多个线程同时访问同一个共享资源将可能发生无法预知的错误。例如

文档评论(0)

1亿VIP精品文档

相关文档