1、第第9章章 高级网络编程高级网络编程API 第第9章章 高级网络编程高级网络编程API 9.1 MFC9.1 MFC提供的提供的WinsockWinsock类类9.2 9.2 信报信报API(MAPI)API(MAPI)9.3 WinInet API9.3 WinInet API9.4 9.4 其他网络程序设计其他网络程序设计APIAPI习题习题第第9章章 高级网络编程高级网络编程API 9.1 MFC提供的提供的Winsock类类 9.1.1 CAsyncSocket类 CAsyncSocket类封装了一些基本的Windows Sockets API函数,它提供了与较低层Windows So
2、ckets对话的接口,一般适合于有一定基础的网络编程者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。CAsyncSocket类定义了一组非常有用的成员函数,这些函数的功能和格式与前几章介绍的函数相同或类似,故下面只进行一些简单的说明。第第9章章 高级网络编程高级网络编程API 1Accept()函数Accept()函数格式如下:virtualBOOL Accept(CAsyncSocket&rConnectedSocket,SOCKADDR*lpSockAddr=NULL,int*lpSockAddrLen=NULL);该函数用于在一个套接口上接受连接请求。rConnectedSo
3、cket参数为监听套接口;lpSockAddr参数为指向地址的指针,其初始值为空,在连接建立后保存远程套接口的IP地址;lpSockAddrLen参数为指向客户套接口地址长度的指针。第第9章章 高级网络编程高级网络编程API 2AsyncSelect()函数AsyncSelect()函数格式如下:BOOL AsyncSelect(long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);该函数用于在套接口准备好之后请求事件通知。事件的含义见表8-5,其对应的数值如表9-1所示。第第9章章 高级网络编程高级网络编程API
4、 表9-1网络事件的数值 网络事件类型 对应的数值 FD_READ 0 x01 FD_WRITE 0 x02 FD_OOB 0 x04 FD_ACCEPT 0 x08 FD_CONNECT 0 x10 FD_CLOSE 0 x20 第第9章章 高级网络编程高级网络编程API 3Attach()函数Attach()函数格式如下:BOOL Attach(SOCKET hSocket,long lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);该函数的作用是将一个套接口句柄连接到一个CAsyncSocket对象实例上,即建立两
5、者的关联,这样就可以实现与另一台计算机的连接了。hSocket参数为套接口句柄。第第9章章 高级网络编程高级网络编程API 4Bind()函数Bind()函数格式如下:BOOL Bind(UINT nSocketPort,LPCTSTR lpszSocketAddress=NULL);或 BOOL Bind(const SOCKADDR*lpSockAddr,int nSockAddrLen);该函数用于建立一个本地地址与一个套接口的关联,即绑定。它有两种调用格式:第一种调用格式提供套接口、端口号和地址,使用的是字符串形式的地址,一般常用这种调用方法;第二种调用格式提供SOCKADDR结构类型
6、的地址参数。第第9章章 高级网络编程高级网络编程API 5Close()函数Close()函数格式如下:virtual void Close();该函数用于关闭套接口,释放与套接口有关的系统资源。要注意的是,Close()函数是在对象被删除时由CAsyncSocket的析构函数自动调用的。Close()函数的 行 为 取 决 于 套 接 口 的 S O _ L I N G E R 和SO_DONTLINGER选项。第第9章章 高级网络编程高级网络编程API 6Connect()函数Connect()函数格式如下:BOOL Connect(LPCTSTR lpszHostAddress,UINT
7、 nHostPort);或 BOOL Connect(const SOCKADDR*lpSockAddr,int nSockAddrLen);该函数用于建立与远程套接口的连接。它有两种调用格式:第一种调用格式使用套接口、端口号和地址,且地址使用参数为字符串型的地址参数(如“”)或点分十进制的地址(如“128.56.22.8”);第二种调用格式提供SOCKADDR结构类型的地址参数。第第9章章 高级网络编程高级网络编程API 7Create()函数Create()函数格式如下:BOOL Create(UINT nSocketPort=0,int nSocketType=SOCK_STREAM,l
8、ong lEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,LPCTSTR lpszSocketAddress=NULL);在调用CAsyncSocket的构造函数创建了CAsyncSocket对象后,需要调用Create()函数来创建底层的套接口。因为CAsyncSocket的构造函数没有带参数,所以它只创建一个新的空套接口对象,创建底层套接口的真正工作是由Create()函数来完成的。第第9章章 高级网络编程高级网络编程API Create()函数中,第一个参数nSocketPort用于指定一个分配给套接口的端口号,其默
9、认值为0,其真正的含义是告诉系统可以由系统给该套接口分配一个端口号。在开发服务器程序时,应该明确地分配一个端口号(即前面介绍的“众所周知”的端口号),这样客户就可以方便地使用该端口号与服务器连接。在开发客户程序时,可以使用默认的0值,即由系统自动分配一个端口号。函数的第二个参数nSocketType用来指定是流式(SOCK_STREAM)还是数据报式(SOCK_DGRAM)套接口。第第9章章 高级网络编程高级网络编程API 第三个参数lEvent用来指定一个将为应用程序生成通知的事件。在默认情况下,所有的事件都会生成通知。最后一个参数lpszSocketAddress允许我们为套接口指定一个网
10、络地址,其默认值为0,表示套接口的地址将限定为本地机。该地址以点分十进制的形式给定,如“128.56.22.8”。第第9章章 高级网络编程高级网络编程API 8Detach()函数Detach()函数格式如下:SOCKET Detach();该函数的作用是将上一次建立关联的套接口句柄断开,并返回此套接口句柄。9FromHandle()函数FromHandle()函数格式如下:static*PASCAL FromHandle(SOCKET hSocket);该函数的hSocket参数指定一个套接口的句柄,其作用是返回与此套接口关联的CAsyncSocket对象的指针。如果没有与此套接口关联的CA
11、syncSocket对象,则返回值为空(NULL)。第第9章章 高级网络编程高级网络编程API 10GetLastError()函数GetLastError()函数格式如下:static int GetLastError();在实际应用中,当调用的操作失败后使用该函数返回套接口的错误代码。11GetPeerName()函数GetPeerName()函数格式如下:BOOL GetPeerName(CString&rPeerAddress,UINT&rPeerPort);或 BOOL GetPeerName(SOCKADDR*lpSockAddr,int*lpSockAddrLen);第第9章章
12、高级网络编程高级网络编程API 对于指定的套接口调用GetPeerName()函数,就可以返回与之对应的远程套接口的IP地址和端口号。远程套接口的IP地址和端口号分别由rPeerAddress和rPeerPort参数返回,也可以由指向SOCKADDR结构的参数lpSockAddr返回。12GetSockName()函数GetSockName()函数格式如下:BOOL GetSockName(CString&rSocketAddress,UINT&rSocketPort);或 BOOL GetSockName(SOCKADDR*lpSockAddr,int*lpSockAddrLen);第第9章
13、章 高级网络编程高级网络编程API 该函数的作用与GetPeerName()函数类似,对于给定的套接口,就可以返回其IP地址和端口号。IP地址和端口号分别由rSocketAddress和rSocketPort参数返回,也可以由指向SOCKADDR结构的参数lpSockAddr返回。13GetSockOpt()函数GetSockOpt()函数格式如下:BOOL GetSockOpt(int nOptionName,void*lpOptionValue,int*lpOptionLen,int nLevel=SOL_SOCKET);该函数用于返回一个套接口的选项。获取的选项值由参数lpOptionV
14、alue确定,其长度由lpOptionLen指针指向的值确定;nOptionName参数指出要获取的选项名,nLevel参数说明选项级别,默认的选项级别是SOL_SOCKET。该函数仅支持SOL_SOCKET和IPPROTO_TCP两个选项级别。第第9章章 高级网络编程高级网络编程API 14SetSockOpt()函数SetSockOpt()函数格式如下:BOOL SetSockOpt(int nOptionName,const void*lpOptionValue,int nOptionLen,int nLevel=SOL_SOCKET);该函数的作用与GetSockOpt()函数相反,用
15、于设置一个套接口的选项。要设置的选项值由参数lpOptionValue确定,其他参数的含义与GetSockOpt()函数相同。15IOCtl()函数IOCtl()函数格式如下:BOOL IOCtl(long lCommand,DWORD*lpArgument);该函数用于设置套接口的工作模式。第第9章章 高级网络编程高级网络编程API 16Listen()函数Listen()函数格式如下:BOOL Listen(int nConnectionBacklog=5);该函数用于连接的监听,当调用成功时返回一个非0的值。参数nConnectionBacklog的取值区间为15,默认值为5,它指出正在
16、等待连接的最大队列长度。17OnAccept()函数OnAccept()函数格式如下:virtual void OnAccept(int nErrorCode);该函数是一个需要重载的回调函数,当一个套接口可能需要与另一端建立连接时,可以调用此函数处理相应的消息。参数nErrorCode指出最新的错误代码。第第9章章 高级网络编程高级网络编程API 18OnClose()函数OnClose()函数格式如下:virtual void OnClose(int nErrorCode);该函数是一个需要重载的回调函数,当一个套接口关闭时,可以调用此函数处理相应的消息。19OnConnect()函数On
17、Connect()函数格式如下:virtual void OnConnect(int nErrorCode);该函数是一个需要重载的回调函数,当一个套接口成功建立连接或连接失败时,可以调用此函数处理相应的消息。第第9章章 高级网络编程高级网络编程API 20OnOutOfBandData()函数OnOutOfBandData()函数格式如下:virtual void OnOutOfBandData(int nErrorCode);该函数是一个需要重载的回调函数,如果一些非常急需的数据已经准备好,就会发出相应的消息,这一类消息的处理需要由该函数完成。21OnReceive()函数OnReceiv
18、e()函数格式如下:virtual void OnReceive(int nErrorCode);该函数是一个需要重载的回调函数,当一个套接口已经准备好数据,并可以由函数Receive()接收时,就可以调用此函数处理相应的消息。举例说明如下:第第9章章 高级网络编程高级网络编程API/下面的CMyAsyncSocket是CAsyncSocket类的派生类void CMyAsyncSocket:OnReceive(int nErrorCode)static int i=0;i+;TCHAR buff4096;int nRead;nRead=Receive(buff,4096);switch(nR
19、ead)第第9章章 高级网络编程高级网络编程API case 0:Close();break;case SOCKET_ERROR:if(GetLastError()!=WSAEWOULDBLOCK)AfxMessageBox(Error occurred);Close();第第9章章 高级网络编程高级网络编程API break;default:buffnRead=0;/terminate the string CString szTemp(buff);m_strRecv+=szTemp;/m_strRecv 是一个在CMyAsyncSocket中说明的字符串 if(szTemp.Compare
20、NoCase(bye)=0)ShutDown();CAsyncSocket:OnReceive(nErrorCode);第第9章章 高级网络编程高级网络编程API 22OnSend()函数OnSend()函数格式如下:virtual void OnSend(int nErrorCode);该函数是一个需要重载的回调函数,当一个套接口已经准备好数据,并可以由Send()函数发送时,就可以调用该函数处理相应的消息。举例说明如下:/CMyAsyncSocket是CAsyncSocket派生类并定义如下变量/CString m_sendBuffer;/int m_nBytesSent;/int m_n
21、BytesBufferSize;第第9章章 高级网络编程高级网络编程API void CMyAsyncSocket:OnSend(int nErrorCode)while(m_nBytesSent message_reference,CMC_MSG_AND_ATT_HDRS_ONLY,&pMessage,0,NULL);第第9章章 高级网络编程高级网络编程API if(Status!=CMC_SUCCESS)/进行错误处理Status=cmc_act_on(Session,pMsgSummary-message_reference,CMC_ACT_ON_DELETE,0,0,NULL);if(
22、Status!=CMC_SUCCESS)第第9章章 高级网络编程高级网络编程API/进行错误处理Status=cmc_free(PmsgSummary);Status=cmc_free(pMessage);第第9章章 高级网络编程高级网络编程API 9.3 WinInet API9.3.1 WinInet概述1WinInet中句柄的概念句柄的概念对于使用MFC进行程序设计的人员来说应该是非常熟悉的了,在WinInet中(包括后面要介绍的ISAPI和TAPI)同样要经常使用句柄的概念。第第9章章 高级网络编程高级网络编程API HINTERNET句柄与其他Win32句柄的重要区别在于,Inter
23、net句柄被安排在一个树型体系结构中,由InternetOpen()返回的对话句柄是该树型体系的主干,由InternetConnect()返回的连接句柄是该体系的分支,指向格式文件的句柄和查询结果构成该树型体系的树叶。句柄可以从派生出它的句柄继承属性,例如在异步方法下,我们只需调用一次InternetCloseHandle()来关闭所有的分支句柄,由它派生出的所有句柄都将关闭。根据句柄的具体类型,HINTERNET句柄可有许多不同的选项与之相联系,这些选项可以通过InternetQueryOption()和InterSetOption()来访问。它们可以用来访问如下信息:句柄的具体类型、超时设
24、置、回调、环境变量、缓冲区大小以及其他设置。第第9章章 高级网络编程高级网络编程API 2WinInet中错误的处理WinInet函数在调用时,如果调用成功则返回一个有效的句柄,如果调用失败则函数返回FALSE或NULL。在函数调用失败时可以调用GetLastError()函数得到具体的错误信息。当GetLastError()函数返回的错误信息是ERROR_INTERNET_EXTENDED_ERROR时,对于F T P 或 G o p h e r 服 务 器,可 进 一 步 通 过 调 用InternetGetLastResponseInfo()函数得到更多的信息。对于HTTP操作,可以使用
25、InternetErrorDlg()函数来显示一个错误信息对话框,允许用户对如何处理错误做出选择。第第9章章 高级网络编程高级网络编程API 3WinInet函数缓冲区参数的含义许多WinInet API函数使用指针(lpszBuffer)参数和缓冲区长度(lpdwBufferLength)参数返回一个可变长度的字符串。在传送的缓冲区大小不能容纳返回的字符串时(或指针为NULL),函数调用将失败。如果使用GetLastError()函数,将返回ERROR_INSUFFICIENT_BUFFER错误。4WinInet函数的异步I/O操作WinInet函数的默认操作是同步操作,但这对于完成时间不确
26、定的一些操作是不合适的,因此如果要使用异步操作,可以通过调用InterOpen()函数来打开一个对话,设置一个叫INTERNET_FLAG_ASYNC的标志来完成。第第9章章 高级网络编程高级网络编程API 9.3.2 基本WinInet函数1打开一个WinInet对话大多数的WinInet函数在使用之前,必须首先调用InternetOpen()函数,以打开一个新的对话,然后在调用其他函数时以该函数返回的句柄为输入参数,才可以进行其他操作。该函数的调用格式如下:第第9章章 高级网络编程高级网络编程API HINTERNET InternetOpen(IN LPCTSTR lpszAgent,I
27、N DWORD dwAccessType,IN LPCTSTR lpszProxyName,IN LPCTSTR lpszProxyBypass,IN DWORD dwFlags);第第9章章 高级网络编程高级网络编程API 该函数在WinInet应用程序中是第一个被调用的函数,它的功能是初始化WinInet库和数据结构,为其他WinInet调用做好准备。在WinInet中,当对话操作完成以后,应该使用InternetCloseHandle()函数关闭该对话句柄,以释放与该对话句柄相关的资源。尽管在一个WinInet应用中可能使用一次InternetOpen()函数调用就足够了,但WinIne
28、t允许多次调用该函数。第第9章章 高级网络编程高级网络编程API lpszAgent参数在HTTP协议中是用户代理的名字,例如Microsoft Internet Explorer。dwAccessType参数表示存取类型,它可设置为:INTERNET_OPEN_TYPE_DIRECT,表示在本地解决所有的主机名问题。INTERNET_OPEN_TYPE_PRECONFIG,表示获取代理或从注册表直接配置。INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,表示获取代理或从注册表直接配置并防止 startup的使用。INTERNET_OPEN_TYPE
29、_PROXY,表示用代理服务器发送请求。第第9章章 高级网络编程高级网络编程API l p s z P r o x y N a m e 参 数 表 示 代 理 服 务 器 名 称。LpszProxyBypass参数定义一个字符串,可以表示在本地机上决定地址列表,该字符串中包含的每个地址请求将在本地机进行处理,而不被送到代理服务器。DwFlags是一个无符号的长整型量,该标志的不同取值影响函数的操作行为。当它的取值为INTERNET_FLAG_ASYNC时,表示该对话句柄或由它派生出的句柄启动异步操作;为INTERNET_FLAG_FROM_CACHE时(等同INTERNET_FLAG_OFFL
30、INE),表示不进行网络请求,所有操作从高速缓冲返回,如果请求不在高速缓冲中,则返回适当的错误,如ERROR_FILE_NOT_FOUND。要注意这些取值可以进行适当的组合。第第9章章 高级网络编程高级网络编程API 2与服务器建立连接为了与FTP、HTTP或Gopher服务器进行通信,我们首先应该与服务器建立连接。与服务器建立连接的函数是InternetConnect(),它的原型如下:HINTERNET InternetConnect(IN HINTERNET hInternet,IN LPCTSTR lpszServerName,IN INTERNET_PORT nServerPort,
31、IN LPCTSTR lpszUserName,IN LPCTSTR lpszPassword,IN DWORD dwService,IN DWORD dwFlags,IN DWORD_PTR dwContext);第第9章章 高级网络编程高级网络编程API 该函数调用成功后返回一个对FTP、HTTP或Gopher会话的HINTERNET型连接句柄,该连接句柄是由调用InternetOpen()函数时所创建的对话句柄派生出来的,它继承了对话句柄的属性。对于FTP协议,调用InternetConnect()函数时将与服务器建立一条真正的连接;而对于HTTP和Gopher协议来说,到指定的服务器请
32、求进行时才建立连接。hInternet参数是先前InternetOpen()函数调用返回的一个有效的对话句柄。第第9章章 高级网络编程高级网络编程API lpszServerName和nServerPort参数指出要连接服务器的名称和端口号。服务器名称可以是点分十进制表示的IP地址,如11.0.1.45。nServerPort参数如果是INTERNET_INVALID_PORT_NUMBER,则使用由dwService确定的默认端口,也可以是以下的一些常数:NTERNET_DEFAULT_FTP_PORT,表示使用FTP服务器的默认端口21。INTERNET_DEFAULT_GOPHER_PO
33、RT,表示使用Gopher服务器的默认端口70。第第9章章 高级网络编程高级网络编程API INTERNET_DEFAULT_HTTP_PORT,表示使用HTTP服务器的默认端口80。INTERNET_DEFAULT_HTTPS_PORT,表示使用HTTPS服务器的默认端口443。INTERNET_DEFAULT_SOCKS_PORT,表示使用SOCKS防火墙服务器的默认端口1080。lpszUserName和lpszPassword参数表示入网时的用户名和口令字,如果lpszUserName参数为NULL,除HTTP外,函数将使用一个合适的默认值。如对FTP服务器,则使用anonymous。
34、如果lpszPassword参数为NULL,则使用anonymous做为口令,但对FTP服务器,一般使用用户的电子邮件地址作为口令。FTP服务器中这两个参数的各种取值如表9-3所示。第第9章章 高级网络编程高级网络编程API 表9-3lpszUserName和lpszPassword参数的取值lpszUsername 参数 lpszPassword参数 发送给FTP 服务器的用户名 发送给FTP 服务器的口令 NULL NULL“anonymous”用户电子邮件名 非空字符串 NULL lpszUsername“”NULL 非空字符串 错误 错误 非空字符串 非空字符串 lpszUsernam
35、e lpszPassword 第第9章章 高级网络编程高级网络编程API dwService参数指出连接的服务类型,它可以取如下的值:INTERNET_SERVICE_FTP,表示FTP服务。INTERNET_SERVICE_GOPHER,表示Gopher服务。INTERNET_SERVICE_HTTP,表示HTTP服务。dwFlags参数当前只能取INTERNET_SERVICE_FTP值,表示对于FTP连接采用被动方式。该函数调用失败时返回NULL,可以调用GetLastError()函数或InternetGetLast-ResponseInfo()函数取得进一步的错误信息。第第9章章 高
36、级网络编程高级网络编程API 3句柄选项的设置与查询我们可以对一个Internet的句柄设置一些选项,以控制对句柄的操作行为。对句柄设置选项要调用InternetSetOption()函数,其函数原型如下:BOOL InternetSetOption(IN HINTERNET hInternet,IN DWORD dwOption,IN LPVOID lpBuffer,IN DWORD dwBufferLength );第第9章章 高级网络编程高级网络编程API hInternet参数表示将要被设置选项的句柄;lpBuffer和dwBufferLength参数分别指缓冲区和缓冲区的长度;lpB
37、uffer中存有选项;dwOption是要设置的选项,它可以取下列值:INTERNET_OPTION_BYPASS_EDITED_ENTRY INTERNET_OPTION_CACHE_TIMESTAMPS INTERNET_OPTION_CALLBACK INTERNET_OPTION_CLIENT_CERT_CONTEXT INTERNET_OPTION_CONNECT_RETRIES 第第9章章 高级网络编程高级网络编程API INTERNET_OPTION_CONNECT_TIMEOUT INTERNET_OPTION_CONNECTED_STATE INTERNET_OPTION_C
38、ONTEXT_VALUE INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_CONTROL_SEND_TIMEOUT INTERNET_OPTION_DATAFILE_NAME INTERNET_OPTION_DIGEST_AUTH_UNLOAD INTERNET_OPTION_END_BROWSER_SESSION 第第9章章 高级网络编程高级网络编程API INTERNET_OPTION_ERROR_MASK INTERNET_ERROR_MASK_COMBINED_SEC_CERT INTERNET_ERROR_MASK_IN
39、SERT_CDROM INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY INTERNET_OPTION_EXTENDED_ERROR INTERNET_OPTION_FROM_CACHE_TIMEOUT 第第9章章 高级网络编程高级网络编程API INTERNET_OPTION_HANDLE_TYPE:该选项只能用于下面要介绍的选项查询函数。句柄类型可能的返回值如下:INTERNET_HANDLE_TYPE_CONNECT_FTP INTERNET_HANDLE_TYPE_CONNECT_GOPHER INTERNET_HANDLE_T
40、YPE_CONNECT_HTTP INTERNET_HANDLE_TYPE_FILE_REQUEST INTERNET_HANDLE_TYPE_FTP_FILE第第9章章 高级网络编程高级网络编程API INTERNET_HANDLE_TYPE_FTP_FILE_HTML INTERNET_HANDLE_TYPE_FTP_FIND INTERNET_HANDLE_TYPE_FTP_FIND_HTML INTERNET_HANDLE_TYPE_GOPHER_FILE INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML INTERNET_HANDLE_TYPE_GOPHER
41、_FIND INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML第第9章章 高级网络编程高级网络编程API INTERNET_HANDLE_TYPE_HTTP_REQUEST INTERNET_HANDLE_TYPE_INTERNETINTERNET_OPTION_HTTP_VERSION INTERNET_OPTION_IGNORE_OFFLINE INTERNET_OPTION_MAX_CONNS_PER_SERVER INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER INTERNET_OPTION_PARENT_HANDLE 第第9章
42、章 高级网络编程高级网络编程API INTERNET_OPTION_PASSWORD INTERNET_OPTION_PER_CONNECTION_OPTION INTERNET_OPTION_PROXY INTERNET_OPTION_PROXY_PASSWORD INTERNET_OPTION_PROXY_USERNAME INTERNET_OPTION_READ_BUFFER_SIZE INTERNET_OPTION_RECEIVE_TIMEOUT INTERNET_OPTION_REFRESH INTERNET_OPTION_RESET_URLCACHE_SESSION 第第9章章 高
43、级网络编程高级网络编程API INTERNET_OPTION_REQUEST_FLAGS:该选项只能用于下面要介绍的选项查询函数,可取的值如下:INTERNET_REQFLAG_CACHE_WRITE_DISABLED INTERNET_REQFLAG_FROM_CACHE INTERNET_REQFLAG_NET_TIMEOUT INTERNET_REQFLAG_NO_HEADERS INTERNET_REQFLAG_VIA_PROXYINTERNET_OPTION_SECONDARY_CACHE_KEY INTERNET_OPTION_SECURITY_CERTIFICATE INTERN
44、ET_OPTION_SECURITY_CERTIFICATE_STRUCT 第第9章章 高级网络编程高级网络编程API INTERNET_OPTION_SECURITY_FLAGS:该选项只能用于下面要介绍的选项查询函数。它可以是下列值的组合:SECURITY_FLAG_128BIT SECURITY_FLAG_STRENGTH_STRONG SECURITY_FLAG_40BIT SECURITY_FLAG_STRENGTH_WEAK SECURITY_FLAG_56BIT第第9章章 高级网络编程高级网络编程API SECURITY_FLAG_STRENGTH_MEDIUM SECURITY
45、_FLAG_FORTEZZA SECURITY_FLAG_IETFSSL4 SECURITY_FLAG_IGNORE_CERT_CN_INVALIDSECURITY_FLAG_IGNORE_CERT_DATE_INVALIDSECURITY_FLAG_IGNORE_REDIRECT_TO_HTTP SECURITY_FLAG_IGNORE_REDIRECT_TO_HTTPS SECURITY_FLAG_IGNORE_REVOCATION第第9章章 高级网络编程高级网络编程API SECURITY_FLAG_IGNORE_UNKNOWN_CA SECURITY_FLAG_IGNORE_WRONG
46、_USAGE SECURITY_FLAG_NORMALBITNESS SECURITY_FLAG_STRENGTH_WEAK SECURITY_FLAG_PCT SECURITY_FLAG_PCT4 SECURITY_FLAG_SECURE SECURITY_FLAG_SSL第第9章章 高级网络编程高级网络编程API SECURITY_FLAG_SSL3 SECURITY_FLAG_UNKNOWNBITINTERNET_OPTION_SECURITY_KEY_BITNESS INTERNET_OPTION_SEND_TIMEOUT INTERNET_OPTION_SETTINGS_CHANGE
47、D INTERNET_OPTION_URL INTERNET_OPTION_USER_AGENT INTERNET_OPTION_USERNAME INTERNET_OPTION_VERSION INTERNET_OPTION_WRITE_BUFFER_SIZE 第第9章章 高级网络编程高级网络编程API 这些选项的含义在MSDN或WinInet Help中有详细的说明。以上选项绝大部分对于选项设置和选项查询函数都可以使用,但也要注意有少部分的选项只能用于选项查询函数。当 然,对 于 设 置 的 选 项 也 可 以 使 用InternetQueryOption()函数进行查询,该函数的原型如下
48、:BOOL InternetQueryOption(IN HINTERNET hInternet,IN DWORD dwOption,OUT LPVOID lpBuffer,IN OUT LPDWORD lpdwBufferLength);第第9章章 高级网络编程高级网络编程API 该函数的参数与InternetSetOption()函数的参数含义是相同的,只是lpBuffer参数是输出参数;lpdwBufferLength参数调用时是输入参数,返回时是输出参数,返回实际需要的缓冲区长度。4回调函数前面说过,WinInet函数在默认情况下是同步操作的,如果要异步使用,在对话句柄由Interne
49、tOpen()创建时,dwFlags参数必须设置为INTERNET_FLAG_ASYN,还要指定一个环境变量,并为句柄指定一个返回函数,而该返回函数通过InternetSetStatusCallback()函数调用与一个句柄连接,InternetSetStatusCallback()的原型如下:第第9章章 高级网络编程高级网络编程API I N T E R N E T _ S T A T U S _ C A L L B A C K InternetSetStatusCallback(IN HINTERNET hInternet,IN INTERNET_STATUS_CALLBACK lpfnI
50、nternetCallback);第第9章章 高级网络编程高级网络编程API 该 函 数 的 h I n t e r n e t 参 数 指 定 一 个 将 在 由lpfnInternetCallback指定的回调函数中使用的句柄。由该句柄派生出的所有的句柄在呼叫被连接之后,将继续使用该回调函数。由lpfnInternetCallback参数指定的返回函数的原型如下:VOID(CALLBACK*INTERNET_STATUS_CALLBACK)(IN HINTERNET hInternet,IN DWORD_PTR dwContext,IN DWORD dwInternetStatus,IN