文档库 最新最全的文档下载
当前位置:文档库 › MFC对Socket编程的封装类简介

MFC对Socket编程的封装类简介

MFC对Socket编程的封装类简介
MFC对Socket编程的封装类简介

MFC对Socket编程的封装类简介[资料]

Microsoft Windows Class Library(MFC)中提供了较高级封装的类用来实现网络通信。图中给出了CSocket类的继承关系。

CAsyncSocket类封装了Windows Sockets API函数,提供了较低层的与Windows Sockets 对话接口,一般适合于有相当水平的网络编程基础者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。

Csocket类派生于CAsyncSocket,它继承了父类中一些常用易懂得的Windows Sockets API函数,并对CAsyncSocket中底层的较难控制的一些API函数或成员函数进行了处理,使得网络传输简捷易用。同时它支持模块化的后台信息处理,解决了

CAsyncSocket中较难克服的多线程处理。

下面将介绍用Visual C++在Windows中实现Socket的CSocket类关成员函数(这些成员函数实际上是从CAsyncSocket类继承来的)。

成员函数和参数说明

1、BOOL Create( UINT nSocketPort = 0,int nSocketType = SOCK_STREAM,long lEvent = FD_READ |FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT| FD_CLOSE,LPCTSTR lpszSocketAddress = NULL )

该函数用来建立Socket。返回值如果函数成功则返回非零值;否则返回0。其中:nSocketPort:为所选择的Socket端口,一般要大于1023,如果该参数为0,则由系统选定一端口,默认值为0;

nSocketType:为套接字类型:是SOCK_STREAM或SOCK_DGRAM,SOCK_STREAM 表示为流套接字(本实验使用基于TCP连接的流套接字编程),SOCK_DGRAM表示为数据报套接字(将在以后实验中讲述),默认值为SOCK_STREAM;

lEvent:标识该Socket要完成哪种工作,默认值为FD_READ|FD_WRITE|FD_OOB| FD_ACCEPT|FD_CONNECT|FD_CLOSE;

lpszSockAddress:一个指向字符串的指针,该字符串包含了被连接套接口的网络地址。一个带点的数字,如“128.56.22.8”默认值为NULL。

注意:

●在CSocket里,将WinsockAPI的初始化(socket)和绑定(bind)两部分工作都完成

了。

2、BOOL Listen( int nConnectionBacklog = 5 )

该函数的作用是等待Socket请求,返回值调用成功时返回非零值,否则为0。Listen 仅对那些支持连接的套接字起作用,也就是SOCK_STREAM类型的套接字。在进程应答连接并把它放到等待队列时,套接字被置成被动模式(passive mode)。本函数一般由那些一次可以有多个连接的服务器使用(或任何需要接收连接的应用)。

nConnectionBacklog表示等待队列的长度,默认值为最大值5,有效值为1-5。

3、BOOL Connect( LPCTSTR lpszHostAddress,UINT nHostPort )

该函数的作用是提出请求。其中:

lpszHostAddress:是对象连接的套接字的网络地址、机器名,例如https://www.wendangku.net/doc/b513076717.html,或以句点分隔的数字,例如“211.80.43.100”。

nHostPort:为接受请求进程的网络地址和Socket端口号。

●注意:Connect函数还有另一个版本:

BOOL Connect(const SOCKADDR* lpSockAddr,int nSockAddrLen);

具体用法可以参阅MSDN Library中关于CAnyscSocket类的阐述。

4、virtual void Close( )

该函数的作用是关闭该Socket。

利用CSocket进行传输的辅助类简介

1、CSocketFile类

CSocketFile继承自CFile类,它可以很自如地用来在基于Windows Socket 网络上上传输数据,但是首先要将一个建立连接CSocket对象实例作为参数进行初始化,然后,一般的用法是将已经初始化的CSocketFile对象连接到CArchive 对象上,然后可以将数据串行化,以使用MFC系列来简化发送和接收数据,而最终实现利用网络的Socket传输和本机上的流传输一样简单。

成员函数:CSocketFile用到的成员函数只有构造函数

1、CSocketFile::CSocketFile( CSocket*pSocket, BOOL bArchiveCompatible = TRUE );

参数:

pSocket:连接到CSocketFile对象的套接口。

BarchiveCompatible:指示该文件对象是否与一个CArchive对象一起使用。只有当希望在单机方式下来使用这个CSocketFile对象时,才传递FALSE。因为光有CSocketFile类实例本身,并没有什么意义所以通常将其置为TRUE。

说明此成员函数用来构造一个CSocketFile对象。当此对象超出范围或被删除时,它的析构函数将使它自己从插槽对象上分离。注意:一个CSocketFile对象也可以在没有CArchive对象的情况下作为一个(受限制)的文件来使用。缺省的,CSocketFile构造函数的bArchiveCompatible参数是TRUE。这表明此文件对象是与一个档案一起使用的。要在没有档案的情况下使用这个文件对象,给bArchiveCompatible参数传递FALSE。在“档案兼容”模式下,一个CSocketFile 对象可以提供更好的表现,并减少出现“死锁”的危险。

2、CArchive类

CArchive类没有基类。CArchive允许以一个永久二进制(通常为磁盘存储)的形式保存一个对象的复杂网络,它可以从永久存储中装载对象,并在内存中重新构造它们。使得数据永久保留的过程就叫作“串行化”。一般可以把一个CArchive对象看作一个二进制流,可以将它和输入输出流iostream类的用法进行比较,CArchive对象一般和一个文件类关联(CFile类或者CSocketFile类)。输入输出流是加工处理ASCII字符,而CArchive类的用处是高效、无冗余地处理

二进制数据。

在CArchive类中,重载了提取(>>)和插入(<<)运算符,它是方便的归档编程接口,主

要支持CObject派生类。

相关文档