- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 网络编程简介
我们这里所说的网络是指因特网,因特网是基于Unix的,Sockets(套接字)是Unix的网络API。Winsock是从Sockets移植过来的TCP/IP编程的最低级Windows API,MFC封装的类有基本的异步套接字CAsyncSocket类和简单的套接字CSocket类。为了使用Winsock编程,程序员得详细了解因特网应用层的具体协议内容。
为了进一步方便因特网应用程序的编写,MFC还包括了对WinInet(Win32 Internet Extensions,32位Windows的因特网扩展)的封装,提供了一些十分好用的类与全局函数,包括对HTTP、FTP、Gopher等协议的处理。
9.1 MFC 套接字类编程
MFC提供了两个套接字类CAsyncSocket和CSocket,它们封装了Winsock的函数,可方便地编写因特网程序。CAsyncSocket提供异步读写(网络通信),而CSocket则提供同步读写(网络通信),后者是前者的派生类,它们都是MFC的基类CObject的派生类。
基类CAsyncSocket提供全面的由事件驱动的Socket通信能力,你可以在派生的套接字类中响应这些事件。CSocket类是CAsyncSocket的派生类,封装和简化了其基类的某些功能,是Winsock的高层接口。
由于Windows程序是基于消息机制的,MFC的套接字类也提供消息编程,可以通过它们的成员函数AsyncSelect来选择感兴趣的事件。
一.编程过程
为了使建立的项目支持Winsock,在AppWizard – Step 4 of 6中,要选中Windows Socket复选框。
1.初始化Winsock环境
在使用MFC 的套接字类之前,必须为应用程序初始化Winsock环境,这只需在项目的应用类的初始化实例函数InitInstance中调用全局函数AfxSocketInit:
BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );
该函数以WSADATA结构:
struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
};
作为可选参数,能得到当前计算机的Winsock的版本等信息。一般不需要,如:
BOOL CSockApp::InitInstance() {
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
... ...
}
若在项目创建过程中,选中了Windows Socket复选框,则MFC会自动添加上述代码。
2.创建套接字
为了使所建立的应用程序可以使用套接字,还必须在项目的应用类中声明一个MFC套接字[派生]类的类变量,如:
class CSockApp : public CWinApp {
... ...
private:
CAsyncSocket m_sSock;
}
在使用该对象之前,必须调用其Create成员函数来构造具体的套接字:
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 );
一般不需要任何输入参数,但对服务器端的网络应用程序,需要指定监听端口号(nSocketPort),如:
客户端:m_sSock.Create();
服务器端:m_sServSock.Create(4000);
其中,参数nSocketType可取值为SOCK_STREAM(对应于传输层面向连接的TCP协议)和SOCK_DGRAM(对应于传输层无连接的UDP协议);参数lpszSocketAddress为网络地址,当计算机上有多个网卡时有用,单网卡可用。
3.打开连接
打开一个网络
文档评论(0)