《MFC下的网络编程.pdf》由会员分享,可在线阅读,更多相关《MFC下的网络编程.pdf(4页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、MFC 下的网络编程Visual C+的 MFC 提供了 CSocket 类用来实现网络通信。下图给出了 CSocket 类的继承关系。下面介绍VC+在Windows 95中实现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,LPCTSTRlpszSocketAddress
2、=NULL)该函数用来建立 Socket。其中,nSocketPort 为所选择的 Socket 端口,一般要大于1023,如果该参数为0,则由系统选定一端口,默认值为0;nSocketType 为套接字类型:SOCK_STREAM 表示为流套接字,SOCK_DGRAM 表示为数据报套接字,默认值为SOCK_STREAM;lEvent标 识 该 Socket要 完 成 哪 种 工 作,默 认 值 为FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE;lpszSockAddress为网络地址信息结构指针,包含网络地址,默认值为 NULL。(
3、2)BOOL Bind(UINT nSocketPort,LPCTSTR lpszSocketAddress=NULL)该函数的作用是将 Socket 端口与网络地址连接起来。参数含义同上。(3)BOOL Listen(int nConnectionBacklog=5)该函数的作用是等待 Socket 请求。其中,nConnec-tionBacklog 表示等待队列的长度,默认值为最大值5。(4)virtual BOOL Accept(CAsyncSocket rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL)该函
4、数的作用是取得队列上第一个连接请求并建立一个具有与 Socket 相同特性的套接字。其中,rConnectedSocket 表示一个新的 Socket。(5)BOOL Connect(LPCTSTR lpszHostAddress,UINT nHostPort)该函数的作用是提出请求。其中,lpszHostAddress 和 nHostPort 为接受请求进程的网络地址和 Socket 端口号。(6)virtual void Close()该函数的作用是关闭该 Socket。利用 CSocket 类直接进行数据通信有两种方式:一种是利用 CSocketFile 类和 Archive类去实现,另
5、一种是利用 CSocket 的成员函数 Receive、Send、ReceiveFrom、SendTo、Listen和 Accept 等来实现(这些成员函数实际上也是从 CAsyncSocket 类继承的)。两种方法的实现步骤如下:Server:Construct Creat Bind Listen Accept SendClose;Cilent:Construct Creat Connect Receive Close。下面就用 VC+的代码分别介绍如何运用上述两种方法来实现 Socket 编程。1、利用 CSocketFile 类和 Archive 类实现(1)服务器程序流程/创建一个套接
6、字对象CSocket sockSrvr;/为上述套接字对象创建一个套接字sockSrvr.Create(nPort);/开始侦听sockSrvr.Listen();/创建一个新的套接字对象CSocket sockRecv;/接受连接sockSrvr.Accept(sockRecv);/创建文件对象CSocketFile file(&sockRecv);/创建一个 archive 对象CArchive arIn(&file,CArchive:load);/*or*/_CArchive arOut(&file,CArchive:store);/使用 archive 对象传输数据arIn dwVal
7、ue;/*or*/arOut dwValue;(2)客户端程序流程/创建一个套接字对象CSocket sockClient;/为这个对象创建一个套接字sockClient.Create();/寻找一个连接sockClient.Connect(strAddr,nPort);/创建一个文件对象CSocketFile file(&sockClient);/创建一个 archive 对象CArchive arIn(&file,CArchive:load);/*or*/_CArchive arOut(&file,CArchive:store);/使用这个对象传输数据arOut dwValue;上述程序中
8、,nPort 是 Socket 的端口号,strAddr 是该机器的 IP 地址(如202.197.1.3 或FTP:/RedA 等),这两个变量在 Server 和 Client 中要一致。当 Server 进程运行至 Listen后便处于睡眠状态直到 Client 进程执行 Connect 时才被唤醒,而后两个进程便开始传输数据了。2、利用 CSocket 的成员函数实现(1)服务器流程/套接字初始化if(!AfxSocketInit()MessageBox(WindowsSocket initial failed!,Send,MB_ICONSTOP);Return;/创建两个套接字对象C
9、Socket ChatSend,server;/创建一个套接字if(!ChatSend.Create(nPort)/nPort=1025MessageBox(SendSocket create failed!,Send,MB_ICONSTOP);else/把本地地址给套接字ChatSend.Bind(nProt,strAddr);/strAddr=202.196.111.1/开始侦听ChatSend.Listen();/创建一个新的套接字并和他相连ChatSend.Accept(Server);/发送一个 CString 对象Server.SendTo(csSendText,csCounts,
10、nPort,strAddr);/关闭这两个套接字Server.Close();ChatSend.Close();(2)客户端程序流程/套接字初始化if(!AfxSocketInit()MessageBox(WindowsSocket initial failed!,Receive,MB_ICONSTOP);return;/创建一个套接字对象CSocket ChatRecieve;/创建一个套接字if(!ChatReceive.Create()MessageBox(ReceiveSocket create failed!,Receive,MB_ICONSTOP);return;else/创建一个
11、对等套接字ChatReceive.Connect(strAddr,nPort);/接受一个 CString 对象ChatReceive.ReceiveFrom(csReceiveText,csCounts,strAddr,nPort);/关闭套接字ChatReceive.Close();上述两个进程完成的工作是:由 Server 进程发送一字符串,Client 进程接收。strAddr和 nPort 的含义与方法1 中的相同;csSendText 和 csReceiveText 为发送与接收的字符串;csCounts 为字串长度,这一长度在两个进程中要求接收长度小于或等于发送长度,否则会导致数据传输错误。另外,在程序中要加入头文件 afxsock.h,CSocket 类的有关说明均在 afxsock.h 中。方法1 适合于对多个不同类型数据的通信,方法2 适合于对字符串的通信,具体选用何种方法则取决于具体应用的需求。
限制150内