第9章_高级网络编程API.ppt_第1页
第9章_高级网络编程API.ppt_第2页
第9章_高级网络编程API.ppt_第3页
第9章_高级网络编程API.ppt_第4页
第9章_高级网络编程API.ppt_第5页
已阅读5页,还剩233页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 高级网络编程API,9.1 MFC提供的Winsock类 9.2 信报API(MAPI) 9.3 WinInet API 9.4 其他网络程序设计API 习题,9.1 MFC提供的Winsock类,9.1.1 CAsyncSocket类 CAsyncSocket类封装了一些基本的Windows Sockets API函数,它提供了与较低层Windows Sockets对话的接口,一般适合于有一定基础的网络编程者使用,可方便地进行底层的网络事件通知及信息回叫控制等操作。 CAsyncSocket类定义了一组非常有用的成员函数,这些函数的功能和格式与前几章介绍的函数相同或类似,故下面只进行

2、一些简单的说明。,1Accept()函数 Accept()函数格式如下: virtualBOOL Accept(CAsyncSocket 该函数用于在一个套接口上接受连接请求。rConnectedSocket参数为监听套接口;lpSockAddr参数为指向地址的指针,其初始值为空,在连接建立后保存远程套接口的IP地址;lpSockAddrLen参数为指向客户套接口地址长度的指针。,2AsyncSelect( )函数 AsyncSelect()函数格式如下: BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEP

3、T | FD_CONNECT | FD_CLOSE ); 该函数用于在套接口准备好之后请求事件通知。事件的含义见表8-5,其对应的数值如表9-1所示。,表9-1网络事件的数值,3Attach( )函数 Attach()函数格式如下: BOOL Attach(SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE ); 该函数的作用是将一个套接口句柄连接到一个CAsyncSocket对象实例上,即建立两者的关联,这样就可以实现与另一台计算机的连接了。hSocket参

4、数为套接口句柄。,4Bind( )函数 Bind()函数格式如下: BOOL Bind( UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL ); 或 BOOL Bind ( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 该函数用于建立一个本地地址与一个套接口的关联,即绑定。它有两种调用格式:第一种调用格式提供套接口、端口号和地址,使用的是字符串形式的地址,一般常用这种调用方法;第二种调用格式提供SOCKADDR结构类型的地址参数。,5Close( )函数 Close()函数格式如下: virt

5、ual void Close(); 该函数用于关闭套接口,释放与套接口有关的系统资源。要注意的是,Close()函数是在对象被删除时由CAsyncSocket的析构函数自动调用的。Close()函数的行为取决于套接口的SO_LINGER和SO_DONTLINGER选项。,6Connect( )函数 Connect()函数格式如下: BOOL Connect( LPCTSTR lpszHostAddress, UINT nHostPort ); 或 BOOL Connect( const SOCKADDR* lpSockAddr, int nSockAddrLen ); 该函数用于建立与远程套接

6、口的连接。它有两种调用格式:第一种调用格式使用套接口、端口号和地址,且地址使用参数为字符串型的地址参数(如“”)或点分十进制的地址(如“”);第二种调用格式提供SOCKADDR结构类型的地址参数。,7Create( )函数 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 lpszSocke

7、tAddress = NULL ); 在调用CAsyncSocket的构造函数创建了CAsyncSocket对象后,需要调用Create()函数来创建底层的套接口。因为CAsyncSocket的构造函数没有带参数,所以它只创建一个新的空套接口对象,创建底层套接口的真正工作是由Create()函数来完成的。,Create()函数中,第一个参数nSocketPort用于指定一个分配给套接口的端口号,其默认值为0,其真正的含义是告诉系统可以由系统给该套接口分配一个端口号。在开发服务器程序时,应该明确地分配一个端口号(即前面介绍的“众所周知”的端口号),这样客户就可以方便地使用该端口号与服务器连接。在

8、开发客户程序时,可以使用默认的0值,即由系统自动分配一个端口号。 函数的第二个参数nSocketType用来指定是流式(SOCK_STREAM)还是数据报式(SOCK_DGRAM)套接口。,第三个参数lEvent用来指定一个将为应用程序生成通知的事件。在默认情况下,所有的事件都会生成通知。 最后一个参数lpszSocketAddress允许我们为套接口指定一个网络地址,其默认值为0,表示套接口的地址将限定为本地机。该地址以点分十进制的形式给定,如“”。,8Detach( )函数 Detach()函数格式如下: SOCKET Detach(); 该函数的作用是将上一次建立关

9、联的套接口句柄断开,并返回此套接口句柄。 9FromHandle()函数 FromHandle()函数格式如下: static * PASCAL FromHandle( SOCKET hSocket ); 该函数的hSocket参数指定一个套接口的句柄,其作用是返回与此套接口关联的CAsyncSocket对象的指针。如果没有与此套接口关联的CAsyncSocket对象,则返回值为空(NULL)。,10GetLastError( )函数 GetLastError()函数格式如下: static int GetLastError(); 在实际应用中,当调用的操作失败后使用该函数返回套接口的错误代码

10、。 11GetPeerName( )函数 GetPeerName()函数格式如下: BOOL GetPeerName(CString,对于指定的套接口调用GetPeerName()函数,就可以返回与之对应的远程套接口的IP地址和端口号。远程套接口的IP地址和端口号分别由rPeerAddress和rPeerPort参数返回,也可以由指向SOCKADDR结构的参数lpSockAddr返回。 12GetSockName( )函数 GetSockName()函数格式如下: BOOL GetSockName(CString,该函数的作用与GetPeerName()函数类似,对于给定的套接口,就可以返回其

11、IP地址和端口号。IP地址和端口号分别由rSocketAddress和rSocketPort参数返回,也可以由指向SOCKADDR结构的参数lpSockAddr返回。 13GetSockOpt( )函数 GetSockOpt()函数格式如下: BOOL GetSockOpt( int nOptionName, void* lpOptionValue, int* lpOptionLen, int nLevel = SOL_SOCKET ); 该函数用于返回一个套接口的选项。获取的选项值由参数lpOptionValue确定,其长度由lpOptionLen指针指向的值确定;nOptionName参数

12、指出要获取的选项名,nLevel参数说明选项级别,默认的选项级别是SOL_SOCKET。该函数仅支持SOL_SOCKET和IPPROTO_TCP两个选项级别。,14SetSockOpt( )函数 SetSockOpt()函数格式如下: BOOL SetSockOpt( int nOptionName, const void* lpOptionValue, int nOptionLen, int nLevel = SOL_SOCKET ); 该函数的作用与GetSockOpt()函数相反,用于设置一个套接口的选项。要设置的选项值由参数lpOptionValue确定,其他参数的含义与GetSock

13、Opt()函数相同。 15IOCtl()函数 IOCtl()函数格式如下: BOOL IOCtl( long lCommand, DWORD* lpArgument ); 该函数用于设置套接口的工作模式。,16Listen()函数 Listen()函数格式如下: BOOL Listen( int nConnectionBacklog = 5 ); 该函数用于连接的监听,当调用成功时返回一个非0的值。参数nConnectionBacklog的取值区间为15,默认值为5,它指出正在等待连接的最大队列长度。 17OnAccept( )函数 OnAccept()函数格式如下: virtual void

14、 OnAccept( int nErrorCode ); 该函数是一个需要重载的回调函数,当一个套接口可能需要与另一端建立连接时,可以调用此函数处理相应的消息。参数nErrorCode指出最新的错误代码。,18OnClose( )函数 OnClose()函数格式如下: virtual void OnClose( int nErrorCode ); 该函数是一个需要重载的回调函数,当一个套接口关闭时,可以调用此函数处理相应的消息。 19OnConnect()函数 OnConnect()函数格式如下: virtual void OnConnect( int nErrorCode ); 该函数是一个

15、需要重载的回调函数,当一个套接口成功建立连接或连接失败时,可以调用此函数处理相应的消息。,20OnOutOfBandData()函数 OnOutOfBandData()函数格式如下: virtual void OnOutOfBandData( int nErrorCode ); 该函数是一个需要重载的回调函数,如果一些非常急需的数据已经准备好,就会发出相应的消息,这一类消息的处理需要由该函数完成。 21OnReceive( )函数 OnReceive()函数格式如下: virtual void OnReceive( int nErrorCode ); 该函数是一个需要重载的回调函数,当一个套接

16、口已经准备好数据,并可以由函数Receive()接收时,就可以调用此函数处理相应的消息。举例说明如下:,/ 下面的CMyAsyncSocket是CAsyncSocket类的派生类 void CMyAsyncSocket:OnReceive(int nErrorCode) static int i=0; i+; TCHAR buff4096; int nRead; nRead = Receive(buff, 4096); switch (nRead), case 0: Close(); break; case SOCKET_ERROR: if (GetLastError() != WSAEWOU

17、LDBLOCK) AfxMessageBox (Error occurred); Close(); ,break; default: buffnRead = 0; /terminate the string CString szTemp(buff); m_strRecv += szTemp; / m_strRecv 是一个在CMyAsyncSocket中说明的字符串 if (szTemp.CompareNoCase(bye) = 0 ) ShutDown(); CAsyncSocket:OnReceive(nErrorCode); ,22OnSend( )函数 OnSend()函数格式如下:

18、virtual void OnSend( int nErrorCode ); 该函数是一个需要重载的回调函数,当一个套接口已经准备好数据,并可以由Send()函数发送时,就可以调用该函数处理相应的消息。举例说明如下: / CMyAsyncSocket是CAsyncSocket派生类并定义如下变量 / CString m_sendBuffer; / int m_nBytesSent; / int m_nBytesBufferSize;,void CMyAsyncSocket :OnSend(int nErrorCode) while (m_nBytesSent m_nBytesBufferSiz

19、e) int dwBytes; if (dwBytes = Send(LPCTSTR)m_sendBuffer + m_nBytesSent, m_nBytesBufferSize - m_nBytesSent) = SOCKET_ERROR) if (GetLastError() = WSAEWOULDBLOCK) break; else, TCHAR szError256; wsprintf(szError, Server Socket failed to send: %d, GetLastError(); Close(); AfxMessageBox (szError); else m_

20、nBytesSent += dwBytes; ,if (m_nBytesSent = m_nBytesBufferSize) m_nBytesSent = m_nBytesBufferSize = 0; m_sendBuffer = ; CAsyncSocket:OnSend(nErrorCode); ,23Receive( )函数 Receive()函数格式如下: virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 ); 该函数用于获得已经与当前套接口建立连接的远程套接口发送的数据,该数据存入lpBuf缓冲区中。 24R

21、eceiveFrom()函数 ReceiveFrom()函数格式如下:,int ReceiveFrom( void* lpBuf, int nBufLen, CString 该函数用于向与当前套接口已经建立连接的远程套接口发送数据。,26SendTo( )函数 SendTo()函数格式如下: int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 ); 或 int SendTo( const void* lpBuf, int nBufLe

22、n, const SOCKADDR* lpSockAddr, int nSockAddrLen, int nFlags = 0 ); 该函数用于向无连接的远程套接口发送数据。,27ShutDown( )函数 ShutDown()函数格式如下: BOOL ShutDown( int nHow = sends ); 调用该函数并不影响套接口的打开状态,它不关闭套接口,只可以控制是否能够继续发送或接收数据,即是否允许继续调用Send()和Receive()函数。因此,可以将ShutDown()的功能理解为对接收或发送功能的关闭,具体的控制模式有三种,如表9-2所示。,表9-2控制模式的值,9.1.2

23、 CSocket类 CSocket类派生于CAsyncSocket类,它继承了父类中一些常用、易懂的Windows Sockets API函数,并对CAsyncSocket底层中较难控制的一些API函数或成员函数进行了处理,为Winsock API提供了一个更高级别的编程接口。它通过MFC CArchive对象进行信息的接收和发送操作,使得套接口数据输入和输出如同使用MFC的文档一样简捷、易用。同时,它支持模块化的后台信息处理,解决了CAsyncSocket中较难克服的多线程处理问题。 CSocket类提供了如下的一些常用函数。,1Attach( )函数 Attach()函数格式如下: BOO

24、L Attach( SOCKET hSocket ); 该函数将一个套接口句柄连接到一个CSocket对象实例上,从而可以建立与另一端的连接。举例说明如下。 / . class CSockThread : public CWinThread / . Other function and member declarations protected: CSocket m_sConnected; ;,SOCKET hConnected; BOOL CSockThread:InitInstance() / Attach the socket object to the socket handle /

25、in the context of this thread. m_sConnected.Attach(hConnected); return TRUE; / This listening socket has been constructed / in the primary thread.,void CListeningSocket:OnAccept(int nErrorCode) / This CSocket object is used just temporarily / to accept the incoming connection. CSocket sConnected; Ac

26、cept(sConnected); / Detach the newly accepted socket and save / the SOCKET handle.,hConnected = sConnected.Detach(); / After detaching it, it should no longer be / used in the context of this thread. / Start the other thread. AfxBeginThread(RUNTIME_CLASS(CSockThread); ,2Create( )函数 Create()函数格式如下: B

27、OOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL ); 在调用CSocket的构造函数(该构造函数不带参数)创建了一个空的CSocket后,再调用Create()函数完成具体的初始化工作。该函数的三个参数都有默认值,对客户机套接口来说,使用默认参数就可以了。但对服务器套接口来说,通常还要为套接口指定一个端口号。,该函数的默认套接口类型是SOCK_STREAM,即流式套接口,当然在程序中我们还可以使用数据报套接口SOCK_DGRAM。但要注意,如果我们

28、打算使用CArchive对象,则必须使用默认的套接口类型SOCK_DGRAM。 当一个服务器有多个IP地址时,可以为套接口指定一个特定的地址。地址的默认值为NULL,指出套接口被创建时使用INADDR_ANY。 3FromHandle( )函数 FromHandle()函数格式如下: static CSocket* PASCAL FromHandle( SOCKET hSocket ); 该函数的参数指出一个套接口句柄,在调用后返回与此套接口关联的CSocket对象指针。如果没有与此套接口关联的对象,则返回NULL。,4IsBlocking( )函数 IsBlocking()函数格式如下: B

29、OOL IsBlocking(); IsBlocking()函数调用后返回一个布尔值,作用为判断在当前时刻套接口是否处于阻塞状态,即是否在等待某种事件的发送。 5CancelBlockingCall( )函数 CancelBlockingCall()函数格式如下: void CancelBlockingCall(); 如果套接口处于阻塞状态,那么调用CancelBlockingCall()函数后,所有套接口的阻塞请求被删除。,6OnMessagePending( )函数 OnMessagePending()函数格式如下: virtual BOOL OnMessagePending(); 该函数

30、是一个需要重载的虚函数,当套接口处于阻塞状态时,调用OnMessagePending()函数可以处理应用中的其他消息。,9.2 信报API(MAPI),9.2.1 MAPI的结构 MAPI的组件如图9-1所示。,图9-1 MAPI组件结构图,9.2.2 MFC对MAPI的支持 1使用VC+提供的AppWizard 利用AppWizard创建一个MAPI应用的过程非常简单,但要注意在MFC AppWizard-Step 4 of 6对话框中要确认对MAPI项的选择,如图9-2所示。,图9-2创建一个MAPI应用,如果选择了MAPI选项,则将为应用程序的File菜单增加一个传送命令,并将为CDoc

31、ument MAPI功能增加相应的消息映射项。若在创建工程时没有选择MAPI选项,则可以通过手工的方式增加MAPI功能。 以上创建应用程序的过程完成后,如果执行“文件”菜单中的“传送”命令,则弹出如图9-3所示的邮件处理窗口,用户就可以根据邮件的具体情况输入收件人、抄送、主题等内容进行邮件处理工作。但一定要注意,如果没有设置默认的邮件处理程序,则在运行“传送”命令时将弹出有关邮件设置的提示信息,要求设置默认邮件处理程序。,图9-3邮件处理窗口,2使用MAPI组件 如果已经创建好了一个项目,但在项目中并没有使用MAPI,则可以使用VC+的Project|Add to Project|Common

32、ents and Controls菜单命令(在中文环境下为“工程”“添加工程”Commonents and Controls),弹出如图9-4所示的对话框,双击Visual C+ Components,从弹出的对话框中选择MAPI组件即可。然后执行程序,在“文件”菜单中加入“Send”菜单命令。,图9-4插入MAPI对话框,3手工添加MAPI 我们也可以通过在程序中直接加入代码的方法添加MAPI,操作方法如下: (1) 在“文件”菜单下添加“传送”菜单项(也可以放在其他菜单下)。该菜单项的ID可以从属性中选择ID_FILE_SEND_MAIL(当然用户也可以输入其他ID,但该ID是一个标准的I

33、D命令)。 (2) 为“传送”命令增加消息映射。对于每一个CDocument类,应该增加如下所示的消息映射项:,ON_COMMAND(ID_FILE_SEND_MAIL,OnFileSendMail) ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL,OnUpdateFileSendMail) 增加后的程序为 BEGIN_MESSAGE_MAP(CMapi1Doc, CDocument) /AFX_MSG_MAP(CMapi1Doc) / NOTE - the ClassWizard will add and remove mapping macros here.,

34、/ DO NOT EDIT what you see in these blocks of generated code! /AFX_MSG_MAP ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail) ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail) END_MESSAGE_MAP(),9.2.3 MAPI的高级应用 目前存在以下4种MAPI的客户接口。 简单MAPI: 通用信报调用(Common Messaging Calls,CMS): 扩展MAPI: OLE信报:,9.2.4

35、 通用信报调用CMC 1CMC定义的基本数据类型 CMC定义的基本数据类型有: typedef char CMC_sint8; typedef short CMC_sint16; typedef long int CMC_sint32; typedef unsigned short int CMC_uint16; typedef unsigned long int CMC_uint32; typedef void far * CMC_buffer; typedef char far * CMC_string;,typedef CMC_uint16 CMC_boolean; typedef CM

36、C_sint32 CMC_enum; typedef CMC_uint32 CMC_return_code; typedef CMC_uint32 CMC_flags; typedef CMC_string CMC_object_identifier; #define CMC_FALSE (CMC_boolean)0) #define CMC_TRUE (CMC_boolean)1) CMC中定义的其他数据类型还有: typedef CMC_uint32 CMC_session_id; typedef CMC_uint32 CMC_ui_id; typedef CMC_counted_stri

37、ng CMC_message_reference;,2CMC定义的标志 在CMC中定义了各种类型的标志,这些标志广泛使用在后面介绍的CMC函数中。 (1) CMC定义的扩展标志有: #define CMC_EXT_REQUIRED (CMC_flags) 0 x00010000) #define CMC_EXT_OUTPUT (CMC_flags) 0 x00020000) #define CMC_EXT_LAST_ELEMENT (CMC_flags) 0 x80000000),#define CMC_EXT_RSV_FLAG_MASK (CMC_flags) 0 xFFFF0000) #d

38、efine CMC_EXT_ITEM_FLAG_MASK (CMC_flags) 0 x0000FFFF) (2) CMC定义的附件标志有: #define CMC_ATT_APP_OWNS_FILE (CMC_flags) 1) #define CMC_ATT_LAST_ELEMENT (CMC_flags) 0 x80000000) #define CMC_ATT_OID_BINARY ? ? ? ? ? ? #define CMC_ATT_OID_TEXT ? ? ? ? ? ?,(3) CMC定义的名称类型标志有: #define CMC_TYPE_UNKNOWN (CMC_enum)

39、 0) #define CMC_TYPE_INDIVIDUAL (CMC_enum) 1) #define CMC_TYPE_GROUP (CMC_enum) 2),(4) CMC定义的角色标志有: #define CMC_ROLE_TO (CMC_enum) 0) #define CMC_ROLE_CC (CMC_enum) 1) #define CMC_ROLE_BCC (CMC_enum) 2) #define CMC_ROLE_ORIGINATOR (CMC_enum) 3) #define CMC_ROLE_AUTHORIZING_USER (CMC_enum) 4),(5) CMC

40、定义的接收标志有: #define CMC_RECIP_IGNORE (CMC_flags) 1) #define CMC_RECIP_LIST_TRUNCATED (CMC_flags) 2) #define CMC_RECIP_LAST_ELEMENT (CMC_flags) 0 x80000000),(6) CMC定义的消息标志有: #define CMC_MSG_READ (CMC_flags) 1) #define CMC_MSG_TEXT_NOTE_AS_FILE (CMC_flags) 2) #define CMC_MSG_UNSENT (CMC_flags) 4) #defin

41、e CMC_MSG_LAST_ELEMENT (CMC_flags) 0 x80000000),(7) CMC定义的消息概要标志有: #define CMC_SUM_READ (CMC_flags) 1) #define CMC_SUM_UNSENT (CMC_flags) 2) #define CMC_SUM_LAST_ELEMENT (CMC_flags) 0 x80000000),(8) CMC定义的功能标志有: #define CMC_ERROR_UI_ALLOWED (CMC_flags) 0 x01000000) #defineCMC_LOGON_UI_ALLOWED (CMC_f

42、lags) 0 x02000000) #define CMC_COUNTED_STRING_TYPE (CMC_flags) 0 x04000000),(9) CMC定义的信报发送标志有: #define CMC_SEND_UI_REQUESTED (CMC_flags) 1) /cmc_send()函数使用 #define CMC_FIRST_ATTACH_AS_TEXT_NOTE (CMC_flags) 2) /cmc_send_documents()函数使用 (10) CMC定义的信报操作标志(cmc_act_on()函数使用)有: #define CMC_ACT_ON_EXTENDED

43、 (CMC_enum) 0) #define CMC_ACT_ON_DELETE (CMC_enum) 1),(11) CMC定义的信报列表标志(cmc_list()函数使用)有: #define CMC_LIST_UNREAD_ONLY (CMC_flags) 1) #define CMC_LIST_MSG_REFS_ONLY (CMC_flags) 2) #define CMC_LIST_COUNT_ONLY (CMC_flags) 4) #define CMC_LENGTH_UNKNOWN 0 xFFFFFFFF,(12) CMC定义的读信报标志(cmc_read()函数使用)有: #d

44、efine CMC_DO_NOT_MARK_AS_READ (CMC_flags) 1) #define CMC_MSG_AND_ATT_HDRS_ONLY (CMC_flags) 2) #define CMC_READ_FIRST_UNREAD_MESSAGE (CMC_flags) 4),(13) CMC定义的信报查找标志(cmc_look_up()函数使用)有: #defineCMC_LOOKUP_RESOLVE_PREFIX_SEARCH (CMC_flags) 1) #defineCMC_LOOKUP_RESOLVE_IDENTITY (CMC_flags) 2) #defineCM

45、C_LOOKUP_RESOLVE_UI (CMC_flags) 4) #defineCMC_LOOKUP_DETAILS_UI (CMC_flags) 8) #defineCMC_LOOKUP_ADDRESSING_UI (CMC_flags) 16),(14) CMC定义的断开连接标志(cmc_logoff()函数使用)有: #define CMC_LOGOFF_UI_ALLOWED (CMC_flags) 1) (15) CMC定义的连接标志(cmc_logon()函数使用)有: #define CMC_VERSION (CMC_uint16) 100) (16) CMC定义的查询配置标志

46、有: #define CMC_CONFIG_CHARACTER_SET (CMC_enum) 1) #define CMC_CONFIG_LINE_TERM (CMC_enum) 2) #define CMC_CONFIG_DEFAULT_SERVICE (CMC_enum) 3),#define CMC_CONFIG_DEFAULT_USER (CMC_enum) 4) #define CMC_CONFIG_REQ_PASSWORD (CMC_enum) 5) #define CMC_CONFIG_REQ_SERVICE (CMC_enum) 6) #define CMC_CONFIG_RE

47、Q_USER (CMC_enum) 7) #define CMC_CONFIG_UI_AVAIL (CMC_enum) 8),#define CMC_CONFIG_SUP_NOMKMSGREAD (CMC_enum) 9) #define CMC_CONFIG_SUP_COUNTED_STR (CMC_enum) 10) #define CMC_CONFIG_VER_IMPLEM (CMC_enum) 11) #define CMC_CONFIG_VER_SPEC (CMC_enum) 12),(17) CMC定义的行标志有: #define CMC_LINE_TERM_CRLF (CMC_e

48、num) 0) #define CMC_LINE_TERM_CR (CMC_enum) 1) #define CMC_LINE_TERM_LF (CMC_enum) 2) (18) CMC定义的配置需求标志有: #define CMC_REQUIRED_NO (CMC_enum) 0) #define CMC_REQUIRED_YES (CMC_enum) 1) #define CMC_REQUIRED_OPT (CMC_enum) 2),(19) CMD定义的字符集标志有: #define CMC_CHAR_CP437 1 2 840 113556 3 2 437 #define CMC_C

49、HAR_CP850 1 2 840 113556 3 2 850 #define CMC_CHAR_CP1252 1 2 840 113556 3 2 1252 #define CMC_CHAR_ISTRING 1 2 840 113556 3 2 0 #define CMC_CHAR_UNICODE 1 2 840 113556 3 2 1,(20) CMC定义的返回代码标志有: #define CMC_ERROR_DISPLAYED (CMC_return_code) 0 x00008000) #define CMC_ERROR_RSV_MASK (CMC_return_code) 0 x

50、0000FFFF) #define CMC_ERROR_IMPL_MASK (CMC_return_code) 0 xFFFF0000) #define CMC_SUCCESS (CMC_return_code) 0),#define CMC_E_AMBIGUOUS_RECIPIENT (CMC_return_code) 1) #define CMC_E_ATTACHMENT_NOT_FOUND (CMC_return_code) 2) #define CMC_E_ATTACHMENT_OPEN_FAILURE (CMC_return_code) 3) #define CMC_E_ATTACH

51、MENT_READ_FAILURE (CMC_return_code) 4),#define CMC_E_ATTACHMENT_WRITE_FAILURE (CMC_return_code) 5) #define CMC_E_COUNTED_STRING_UNSUPPORTED (CMC_return_code) 6) #define CMC_E_DISK_FULL (CMC_return_code) 7) #define CMC_E_FAILURE (CMC_return_code) 8) #define CMC_E_INSUFFICIENT_MEMORY (CMC_return_code)

52、 9) #define CMC_E_INVALID_CONFIGURATION (CMC_return_code) 10),#define CMC_E_INVALID_ENUM (CMC_return_code) 11) #define CMC_E_INVALID_FLAG (CMC_return_code) 12) #define CMC_E_INVALID_MEMORY (CMC_return_code) 13) #define CMC_E_INVALID_MESSAGE_PARAMETER (CMC_return_code) 14) #define CMC_E_INVALID_MESSA

53、GE_REFERENCE (CMC_return_code) 15) #define CMC_E_INVALID_PARAMETER (CMC_return_code) 16),#define CMC_E_INVALID_SESSION_ID (CMC_return_code) 17) #define CMC_E_INVALID_UI_ID (CMC_return_code) 18) #define CMC_E_LOGON_FAILURE (CMC_return_code) 19) #define CMC_E_MESSAGE_IN_USE (CMC_return_code) 20) #defi

54、ne CMC_E_NOT_SUPPORTED (CMC_return_code) 21),#define CMC_E_PASSWORD_REQUIRED (CMC_return_code) 22) #define CMC_E_RECIPIENT_NOT_FOUND (CMC_return_code) 23) #define CMC_E_SERVICE_UNAVAILABLE (CMC_return_code) 24) #define CMC_E_TEXT_TOO_LARGE (CMC_return_code) 25),#define CMC_E_TOO_MANY_FILES (CMC_retu

55、rn_code) 26) #define CMC_E_TOO_MANY_RECIPIENTS (CMC_return_code) 27) #define CMC_E_UNABLE_TO_NOT_MARK_AS_READ(CMC_return_code) 28),#define CMC_E_UNRECOGNIZED_MESSAGE_TYPE (CMC_return_code) 29) #defineCMC_E_UNSUPPORTED_ACTION (CMC_return_code) 30) #define CMC_E_UNSUPPORTED_CHARACTER_SET (CMC_return_c

56、ode) 31) #defineCMC_E_UNSUPPORTED_DATA_EXT (CMC_return_code) 32) #defineCMC_E_UNSUPPORTED_FLAG (CMC_return_code) 33),#defineCMC_E_UNSUPPORTED_FUNCTION_EXT (CMC_return_code) 34) #defineCMC_E_UNSUPPORTED_VERSION (CMC_return_code) 35) #defineCMC_E_USER_CANCEL (CMC_return_code) 36) #defineCMC_E_USER_NOT

57、_LOGGED_ON (CMC_return_code) 37),3CMC处理信报的过程 1) 开始对话 在CMC中执行的所有信报操作都是在一个信报对话中进行的。调用cmc_logon()函数可以创建一个CMC对话,cmc_logon()函数将利用信报服务程序建立与邮件服务器的连接,检查用户的登录号(即标识用户),设置邮件服务器的属性参数,并返回一个对话句柄。cmc_logon()函数的调用格式如下:,CMC_return_code cmc_logon( CMC_string service, CMC_string user, CMC_string password, CMC_object_identifier character_set, CMC_ui_id ui_id, CMC_uint16 caller_cmc_version, CMC_flags logon_flags, CMC_session_id FAR *session, CMC_extension FAR *logon_extensions );,该函数的参数很简单,从各参数的名称就可以看出其含义。最后一个参数logon_extensions是一个指向CMC_extension结构数组的指针,该结构在下面的很多函数中都要用到,它包含了使用CMC API函数或结构时的扩展数据。 CMC_extension结构的定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论