版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、word发送E-MAIL程序的设计一、课程设计目的 网络应用与开发课程设计 是学完 网络应用与开发 课程之后,让学生综合运用网络高层协议的工作原理和WINSOCK API的网络编程接口及WINSOCK I/O模型知识,进行实际网络通信程序的设计、调测,以加深对WINSOCK API的网络编程接口及WINSOCK I/O模型知识的理解,提高综合应用应用层协议知识的能力、分析解决问题的能力和网络通信程序设计技能,初步培养设计实用网络通信程序的能力。二、课程设计任务掌握E-MAIL信件结构,掌握e-mail协议的会话过程,掌握支持SMTP认证的SMTP会话过程,理解BASE64编码的作用,并能用程序
2、实现他们。1、课程设计题目及要求发送E-MAIL程序的设计有发送e-mail的界面。程序流程符合e-mail协议的会话过程。实现BASE64编码,能发送附件,在ISP邮箱中能收到所发邮件。2、任务学习网络应用与开发的根本理论,具备初步的独立设计能力。学会查阅技术资料和手册。掌握网络应用与开发的根本应用方法。提高综合运用所学的理论知识独立分析和解决问题的能力。撰写标准的课程设计报告,培养严谨的作风和科学的态度。三、设计方案1、RFC822信件的格式和内容电子邮件的主要局部是信件,电子邮件的各个方面几乎都是围绕它开展的。信件的内容是有ASCII码构成的一系列字符,就是通常所说的文本文件。文本的构成
3、都有一定的格式和标准。无论使用SMTP或者是POP3,了解其信件的根本格式是非常重要的。对于POP3而言,从POP3接收的信件是没有经过整理的,有关信件的一些信息,如发送人、主题、时间、内容都包含在取回的文本中,而一个接收邮件的程序,不仅仅能够把信件从效劳器上取回来,而且必须能够对取回来的内容进行分类整理,最终让用户所看到的是经过处理过的有条理的信件内容。这一点对于SMTP而言,同样很重要,发送的信件要使得对方接收的客户端软件收到信件时,能够识别信件所包含的信息。信件的格式不可以自己定义,许多程序要求对电子邮件进行编制特定的其他功能,以满足需要。和其他客户机/效劳器的应用程序一样,指定标准的协
4、议是必须的,根据协议编写的无论是发送还是接收e-mail的软件,彼此在进行邮件交流时不会存在障碍。以上所说的SMTP和POP3协议只不过Internet E-mail协议的一局部,它给出了与SMTP效劳器或POP3效劳器进行邮件对话的标准。在信件格式中也有协议。最早标准电子邮件核心结构的是RFC822,它是Internet E-mail信件的当前标准。RFC822定义了信件从主机传送到主机时需要的格式化方式。它的主要用途是为信件提供标准化的格式。这样使得不同类型的网络可以相互传送电子邮件。信件主要有三局部组成:信头:Date: Tue,04Dec2001 16: 19: 02+0800From
5、: MD. mailSubject: test. mailTo: . mail空白行信件体:111信件结构可以说分为两大局部:信头和信件体。空白行通常别离各个元素,以便于进行分析,在信件头和信件体之间有一个空白行,用于分隔信头和信件的其余局部。信头是必需的,信体是可选的,如果存在信体,空白行规是必需的,如果只有信头,空白行就是可选的。在信体中,通常也有空白行,起的作用也是一样的。这样设计的信件便于进行语法分析,提取信件的根本信息。2、支持SMTP认证的SMTP会话过程:RFC 2554标准中定义了SMTP的认证过程,但RFC 2554中没有定义具体的认证参数。SMTP的认证功能主要是增加了AU
6、TH命令,AUTH命令有很多种用法,而且有很多中认证机制,AUTH支持的认证机制主要有LOGIN,CRAM-MD5等。LOGIN是大多数免费邮件效劳器都支持的,如163、263与新浪都支持。而新浪还支持CRAM-MD5机制。认证机制一般只在真正发送邮件之前进行,而且只需要执行一次。当认证成功后,即可按原来正常的处理发送邮件。原理是口令-应答Challenge-Response,即会话的过程是发送文本来完成的,过程为交互式的请求应答模式,每次会话效劳器总是返回一定的响应码,表示客户端的请求是否被正确地应答,会话过程有一定的次序。由效劳器发送命令要求客户端答复,客户端根据效劳器发送信息进行答复,如
7、果应答通过了,那么认证成功,即可继续处理。下面对LOGIN机制作一个简单介绍。S:表示效劳器返回,C:表示客户端发送 ,三位数字代码如334为效劳器响应码。LOGIN口令-应答过程如下: 1 C: AUTH LOGIN 2 S: 334 dXNlcm5hbWU6 3 C: bXlnOTQ= (假设邮箱名为myg94”) 4 S: 334 cGFzc3dvcmQ6 5 C: MzQ5OTA5Mg= (假设密码为3499092”) 6 S: 235 Authentication successful. 上述6个步骤的说明如下:1 为客户端向效劳器发送认证指令。 2 效劳端返回base64编码串,成
8、功的响应码为334。编码字符串解码后为“username:,说明要求客户端发送用户名。 3 客户端发送用base64编码的用户名,此处为“myg94”。 4 效劳端返回base64编码串,成功响应码为334。编码字符串解码后为“password:,说明要求客户端发送用户口令。 5 客户端发送用base64编码的口令,此处为“3499092”。 6 成功后,效劳端返回码为235,表示认证成功可以发送邮件了。在SMTP的RFC 821中,在与邮件效劳器连接成功后,第一个命令一般是“HELO。但是在支持认证的邮件效劳器中,第一个命令应改为“EHLO。所以这时的SMTP 会话过程应修改如下:1 C:
9、EHLO2 S: 2503 C: AUTH LOGIN4 S: 334 dXNlcm5hbWU65 C: bXlnOTQ= (假设邮箱名为myg94”)6 S: 334 cGFzc3dvcmQ67 C: MzQ5OTA5Mg= (假设密码为3499092”)8 S: 235 Authenticationsuccessful. 9 Cm10 S: 25011 C12 S: 25013 C: DATA14 S: 35415 C: QUIT16 S: 221S:表示效劳器返回,C:表示客户端发送。3、一封e-mail从用户手中发出,首先要有一个程序把这封e-mail发到smtp效劳器上,再由发送邮件
10、效劳器负责传递邮件到目的信箱,还要一个程序接收邮件。简单的说是由四个模块组成:发送端,smtp效劳器,pop3效劳器,接收端。SMTP是工作在两种情况下:一是电子邮件从客户端传输到效劳器,二是从某一个效劳器传输到另一个效劳器。SMTP效劳器是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP在TCP协议25号端口监听连接请求。4、BASE64编码:按照RFC2045的定义,BASE64被定义为: BASE64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。要采用BASE64编码,这是因为在e-m
11、ail的传输过程中,由于历史原因,e-mail只被允许传送ASCII字符,即一个8位字节的低7位。因此,如果发送了一封带有非ASCII字符(即字节的最高位是1)的e-mail通过有“历史问题的网关时就可能会出现问题。网关可能会把最高位置为0,而单靠改变你字母的位置之类的方案也不能解决这一问题,关于这一点可以参考RFC2046.基于以上的一些主要原因产生了BASE64编码,BASE64的编码方式类似于Unencode。编码过程中还需要注意,邮件信件内容的文本行应该控制在76个字符以内。所以编码时超过76个字符的需要插入crlf(回车换行),插入的crlf不需要经过编码,而原来的要编码的数据中可能
12、有CR(0A)和LF(0D),那么与其他字符一样需要编码,在译码时将碰到的crlf删除即可。四、算法或框图、关键代码(或配置清单)说明按照连接和发送的SMTP会话过程建立 TCP连接是用visual basic6.0中winsock控件实现的,程序流程如下图.构造邮件连接SMTP效劳器按照支持SMTP认证的SMTP会话会话过程发送命令发送EHLO命令发送AUTH LOGIN命令发送用户名发送密码发送MAIL FROM命令发送RCPT TO命令发送DATA命令发送QUIT命令BASE64编码模块1、关键代码BASE64编码DWORD CBase64Coder:_DecodeToBuffer(co
13、nst TempBucket &Decode, PBYTE pBuffer)TempBucketData;DWORDnCount = 0;_DecodeRaw(Data, Decode);for (int i=0; i<3; i+) pBufferi = Data.nDatai;if(pBufferi != 255)nCount+;return nCount;void CBase64Coder:_EncodeToBuffer(const TempBucket &Decode, PBYTE pBuffer)TempBucket Data;_EncodeRaw(Data, D
14、ecode);for (int i=0; i<4; i+)pBufferi = Base64DigitsData.nDatai;switch (Decode.nSize) case 1: pBuffer2 = '=' case 2: pBuffer3 = '='void CBase64Coder:_DecodeRaw(TempBucket &Data, const TempBucket &Decode)BYTE nTemp;Data.nData0 = Decode.nData0;Data.nData0 <<= 2; nTemp
15、= Decode.nData1;nTemp >>= 4;nTemp &= 0x03;Data.nData0 |= nTemp;Data.nData1 = Decode.nData1;Data.nData1 <<= 4;nTemp = Decode.nData2;nTemp >>= 2;nTemp &= 0x0F;Data.nData1 |= nTemp;Data.nData2 = Decode.nData2;Data.nData2 <<= 6;nTemp = Decode.nData3;nTemp &= 0x3F;Data
16、.nData2 |= nTemp; /第4个6位 = 第三个8位的后6位void CBase64Coder:_EncodeRaw(TempBucket &Data, const TempBucket &Decode)BYTE nTemp;Data.nData0 = Decode.nData0;Data.nData0 >>= 2;Data.nData1 = Decode.nData0;Data.nData1 <<= 4;nTemp = Decode.nData1;nTemp >>= 4;Data.nData1 |= nTemp;Data.nDa
17、ta1 &= 0x3F;Data.nData2 = Decode.nData1;Data.nData2 <<= 2;nTemp = Decode.nData2;nTemp >>= 6;Data.nData2 |= nTemp;Data.nData2 &= 0x3F;Data.nData3 = Decode.nData2;Data.nData3 &= 0x3F;BOOL CBase64Coder:_IsBadMimeChar(BYTE nData)switch(nData)case 'r': case 'n': ca
18、se 't': case ' ' :case 'b': case 'a': case 'f': case 'v':return TRUE;default:return FALSE;void CBase64Coder:_Init() / Initialize Decoding i;for (i=0; i<256; i+)CBase64Coder:m_DecodeTablei = -2;for (i=0; i<64; i+)CBase64Coder:m_DecodeTabl
19、eBase64Digitsi= (char) i;CBase64Coder:m_DecodeTableBase64Digitsi|0x80 = (char) i;CBase64Coder:m_DecodeTable'='= -1;CBase64Coder:m_DecodeTable'='|0x80 = -1;CBase64Coder:m_Init = TRUE;SMTP认证的SMTP会话过程的相关代码/连接到效劳器 if (!m_SMTP.Connect(pszHostName, nPort, pszLocalBoundAddress) if (pszLocal
20、BoundAddress && _tcslen(pszLocalBoundAddress) AfxMessageBox("不能连接效劳器"); else AfxMessageBox("不能连接效劳器");return FALSE; else /连接成功 m_bConnected = TRUE; /获得相应 if (!ReadCommandResponse(220) TRACE(_T("An unexpected SMTP login response was receivedn"); Disconnect(); ret
21、urn FALSE; /获得本地机器名if (m_sHeloHostname = _T("auto")/获得主机名char sHostName100;gethostname(sHostName, sizeof(sHostName);TCHAR* pszHostName = A2T(sHostName);m_sHeloHostname = pszHostName; / 进行下一步连接,即进行SMTP会话 BOOL bConnectOk = FALSE; if (lm != NoLoginMethod) bConnectOk = ConnectESMTP(m_sHeloHost
22、name, pszUsername, pszPassword, lm); else bConnectOk = ConnectSMTP(m_sHeloHostname); / 如果失败,那么断开连接 if (!bConnectOk) Disconnect(); return FALSE; return TRUE; / 该函数是通过扩展SMTP会话方式连接效劳器的BOOL CSMTPConnection:ConnectESMTP(LPCTSTR pszLocalName, LPCTSTR pszUsername, LPCTSTR pszPassword, LoginMethod lm) /验证参数
23、ASSERT(pszUsername);ASSERT(pszPassword);ASSERT(lm != NoLoginMethod);USES_CONVERSION;/发送EHLO命令CString sBuf;sBuf.Format(_T("EHLO %srn"), pszLocalName);LPCSTR pszData = T2A(LPTSTR) (LPCTSTR) sBuf);int nCmdLength = strlen(pszData);if (!m_SMTP.Send(pszData, nCmdLength)return FALSE;/检查Hello命令的响应
24、if (!ReadCommandResponse(250)return FALSE;BOOL bLoginOk = FALSE;switch (lm) #ifndef CSMTP_NORSA case CramMD5Method: bLoginOk = CramLogin(pszUsername, pszPassword); / CRAM-MD5 authentication break; #endif case AuthLoginMethod: bLoginOk = AuthLogin(pszUsername, pszPassword); / LOGIN authentication bre
25、ak; case LoginPlainMethod: bLoginOk = AuthLoginPlain(pszUsername, pszPassword); / PLAIN authentication break; default: ASSERT(FALSE); break; return bLoginOk;BOOL CSMTPConnection:SendBodyPart(CSMTPBodyPart* pBodyPart, BOOL bRoot) /Assume success BOOL bSuccess = TRUE; if (!bRoot) /发送信件头 LPSTR pszHeade
26、r = NULL; int nHeaderSize = 0; if (!pBodyPart->GetHeader(pszHeader, nHeaderSize) TRACE(_T("Failed in call to send body parts header, GetLastError returns: %dn"), GetLastError(); return FALSE; if (!m_SMTP.Send(pszHeader, nHeaderSize)bSuccess = FALSE; /释放空间 pBodyPart->FreeHeader(pszHea
27、der); /根信体内容 LPSTR pszBody = NULL; int nBodySize = 0; if (!pBodyPart->GetBody(pszBody, nBodySize) TRACE(_T("Failed in call to send body parts body, GetLastError returns: %dn"), GetLastError();return FALSE; if (!m_SMTP.Send(pszBody, nBodySize)TRACE(_T("Failed in call to send body pa
28、rts body, GetLastError returns: %dn"), GetLastError();bSuccess = FALSE; /释放内存空间 pBodyPart->FreeBody(pszBody); /发送附件 int nChildBodyParts = pBodyPart->GetNumberOfChildBodyParts(); for (int i=0; i<nChildBodyParts && bSuccess; i+) CSMTPBodyPart* pChildBodyPart = pBodyPart->GetCh
29、ildBodyPart(i); bSuccess = SendBodyPart(pChildBodyPart, FALSE); /发送发送MINE结束局部 BOOL bSendFooter = (pBodyPart->GetNumberOfChildBodyParts() != 0); if (bSendFooter) LPSTR pszFooter = NULL; int nFooterSize = 0; if (!pBodyPart->GetFooter(pszFooter, nFooterSize) return FALSE; if (!m_SMTP.Send(pszFoot
30、er, nFooterSize) bSuccess = FALSE; /释放内存 pBodyPart->FreeFooter(pszFooter); return bSuccess;BOOL CSMTPConnection:SendMessage(CSMTPMessage& Message)USES_CONVERSION;ASSERT(m_bConnected); /发送Email命令ASSERT(Message.m_From.m_sEmailAddress.GetLength();CString sBuf;sBuf.Format(_T("MAIL FROM:<%
31、s>rn"), Message.m_From.m_sEmailAddress);LPCSTR pszMailFrom = T2A(LPTSTR) (LPCTSTR) sBuf);int nCmdLength = strlen(pszMailFrom);if (!m_SMTP.Send(pszMailFrom, nCmdLength)TRACE(_T("Failed in call to send MAIL command, GetLastError returns: %dn"), GetLastError();return FALSE;/检查效劳器响应if
32、(!ReadCommandResponse(250)SetLastError(ERROR_BAD_COMMAND);TRACE(_T("An unexpected MAIL response was receivedn");return FALSE; /发送RCPT命令,每一个接受者都需要发送一次/必须有收信人ASSERT(Message.GetNumberOfRecipients(CSMTPMessage:TO) + Message.GetNumberOfRecipients(CSMTPMessage:CC) + Message.GetNumberOfRecipients
33、(CSMTPMessage:BCC);/首先"TO"发送接收者for (int i=0; i<Message.GetNumberOfRecipients(CSMTPMessage:TO); i+)CSMTPAddress* pRecipient = Message.GetRecipient(i, CSMTPMessage:TO);ASSERT(pRecipient);if (!SendRCPTForRecipient(*pRecipient)return FALSE;/然后是 "CC" 接收者for (i=0; i<Message.GetNu
34、mberOfRecipients(CSMTPMessage:CC); i+)CSMTPAddress* pRecipient = Message.GetRecipient(i, CSMTPMessage:CC);ASSERT(pRecipient);if (!SendRCPTForRecipient(*pRecipient)return FALSE;/然后是"BCC" 接收者 for (i=0; i<Message.GetNumberOfRecipients(CSMTPMessage:BCC); i+)CSMTPAddress* pRecipient = Messag
35、e.GetRecipient(i, CSMTPMessage:BCC);ASSERT(pRecipient);if (!SendRCPTForRecipient(*pRecipient)return FALSE;/发送DATA命令char* pszDataCommand = "DATArn"nCmdLength = strlen(pszDataCommand);if (!m_SMTP.Send(pszDataCommand, nCmdLength)TRACE(_T("Failed in call to send MAIL command, GetLastError
36、 returns: %dn"), GetLastError();return FALSE;/检查DATA命令的响应if (!ReadCommandResponse(354)SetLastError(ERROR_BAD_COMMAND);TRACE(_T("An unexpected DATA response was receivedn");return FALSE; /发送信息头CString sHeader = Message.GetHeader();char* pszHeader = T2A(LPTSTR) (LPCTSTR) sHeader);nCmdLe
37、ngth = strlen(pszHeader);if (!m_SMTP.Send(pszHeader, nCmdLength)TRACE(_T("Failed in call to send the header, GetLastError returns: %dn"), GetLastError();return FALSE;BOOL bHasChildParts = (Message.m_RootPart.GetNumberOfChildBodyParts() != 0);if (bHasChildParts | Message.m_bMime)/发送信件内容if(!
38、SendBodyPart(&Message.m_RootPart, TRUE)return FALSE;else/Send the Header for the body (Note in the case of non mime emails, it is just a simple line separarorchar* pszBodyHeader = "rn"nCmdLength = strlen(pszBodyHeader);if (!m_SMTP.Send(pszBodyHeader, nCmdLength)TRACE(_T("Failed in
39、 call to send the body header, GetLastError returns: %dn"), GetLastError();return FALSE;char* pszBody = T2A(LPTSTR) (LPCTSTR) Message.m_RootPart.GetText();ASSERT(pszBody);nCmdLength = strlen(pszBody);/发送信体if (!m_SMTP.Send(pszBody, nCmdLength)TRACE(_T("Failed in call to send the header, Get
40、LastError returns: %dn"), GetLastError();return FALSE;/发送邮件结束指示符char* pszEOM = "rn.rn"nCmdLength = strlen(pszEOM);if (!m_SMTP.Send(pszEOM, nCmdLength)TRACE(_T("Failed in call to send end of message indicator, GetLastError returns: %dn"), GetLastError();return FALSE;/检查结束符响应i
41、f (!ReadCommandResponse(250)SetLastError(ERROR_BAD_COMMAND);TRACE(_T("An unexpected end of message response was receivedn");return FALSE; return TRUE;BOOL CSMTPConnection:ReadResponse(LPSTR pszBuffer, int nInitialBufSize, LPSTR pszTerminator, int nExpectedCode, LPSTR* ppszOverFlowBuffer, i
42、nt nGrowBy)ASSERT(ppszOverFlowBuffer); /验证是否有一个字符串指针ASSERT(*ppszOverFlowBuffer = NULL); /验证字符串是否委空/验证是否创立ASSERT(m_bConnected);/获取结束符的长度int nTerminatorLen = strlen(pszTerminator);/接收获得的数据LPSTR pszRecvBuffer = pszBuffer;int nBufSize = nInitialBufSize;/循环获得响应知道遇到结束符或者超时BOOL bFoundTerminator = FALSE;int
43、 nReceived = 0;DWORD dwStartTicks = :GetTickCount();while (!bFoundTerminator)/超时if (:GetTickCount() - dwStartTicks) >m_dwTimeout)pszRecvBuffernReceived = '0'SetLastError(WSAETIMEDOUT);m_sLastCommandResponse = pszRecvBuffer; /Hive away the last command reponsereturn FALSE;/检查socket是否可读BOOL
44、 bReadible;if (!m_SMTP.IsReadable(bReadible)pszRecvBuffernReceived = '0'm_sLastCommandResponse = pszRecvBuffer; /Hive away the last command reponsereturn FALSE;else if (!bReadible) /没有数据接受到Sleep(250); /sleep/从socket接收数据int nBufRemaining = nBufSize-nReceived-1; /Allows allow one space for the
45、 NULL terminatorif (nBufRemaining<0)nBufRemaining = 0;int nData = m_SMTP.Receive(pszRecvBuffer+nReceived, nBufRemaining);/重新设置超时起始时间if (nData > 0)dwStartTicks = :GetTickCount();/增加获得的数据nReceived += nData; /如果接收数据时错误产生if (nData < 1)/以空字符结束字符串if (pszRecvBuffer)pszBuffernReceived = '0'
46、m_sLastCommandResponse = pszRecvBuffer; /别离出最后一个响应return FALSE; else/以空字符结束字符串if (pszRecvBuffer) pszRecvBuffernReceived = '0'if (nBufRemaining-nData = 0) /检查是否还有空间/申请新的缓冲区nBufSize += nGrowBy; /增加缓冲区LPSTR pszNewBuf = new charnBufSize;/将原来的内容复制到新的缓冲区中,并用新的缓冲区接收数据if (pszRecvBuffer) strcpy(pszNe
47、wBuf, pszRecvBuffer);pszRecvBuffer = pszNewBuf;/删除原来缓冲区if (*ppszOverFlowBuffer) delete *ppszOverFlowBuffer;/将新的缓冲区内容存入溢出缓冲区*ppszOverFlowBuffer = pszNewBuf; / 检查结束符是否被找到/ 检查是否到了响应结束,否那么提前停止循环读取数据,如果有可能会有多行响应bFoundTerminator = (strncmp( &pszRecvBuffer nReceived - nTerminatorLen , pszTerminator, nT
48、erminatorLen ) = 0);/去掉结束符pszRecvBuffer nReceived - nTerminatorLen = '0'/处理多行响应BOOL bSuccess = FALSE;do/ 检查响应是否是错误码char sCode4;strncpy(sCode, pszRecvBuffer, 3 );sCode3 = '0'sscanf(sCode, "%d", &m_nLastCommandResponseCode );bSuccess = (m_nLastCommandResponseCode = nExpec
49、tedCode);/ 别离上一次响应m_sLastCommandResponse = pszRecvBuffer;/ 检查是否有多行响应pszRecvBuffer = strstr( pszRecvBuffer, pszTerminator );if (pszRecvBuffer)pszRecvBuffer += nTerminatorLen;/ 跳过结束符 while ( !bSuccess && pszRecvBuffer );if (!bSuccess)SetLastError(WSAEPROTONOSUPPORT);return bSuccess;/ 使用AUTH LO
50、GIN命令协商登录,即需要对用户名进行编码BOOL CSMTPConnection:AuthLogin(LPCTSTR pszUsername, LPCTSTR pszPassword)USES_CONVERSION;/发送AUTH LOGIN命令CString sBuf;sBuf.Format(_T("AUTH LOGINrn");LPCSTR pszData = T2A(LPTSTR) (LPCTSTR) sBuf);int nCmdLength = strlen(pszData);if (!m_SMTP.Send(pszData, nCmdLength) TRACE(
51、_T("An unexpected error occurred while sending the AUTH commandn"); return FALSE;/初始化CBase64Coder Coder;if (!ReadCommandResponse(334)TRACE(_T("Server does not support AUTH LOGIN!n");return FALSE;else/发送base64编码后的用户名CString sLastCommandString = m_sLastCommandResponse;sLastCommandS
52、tring = sLastCommandString.Right(sLastCommandString.GetLength() - 4);LPCSTR pszLastCommandString = T2A(LPTSTR) (LPCTSTR) sLastCommandString);Coder.Decode(pszLastCommandString);if (strcmp(Coder.DecodedMessage(), "Username:") = 0)Coder.Encode(T2A(LPTSTR)pszUsername);sBuf.Format(_T("%srn"), Coder.EncodedMessage();pszData = T2A(LPTSTR) (LPCTSTR) sBuf);nCmdLength = strlen(pszData);i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 论科学教育中科学探究的有效开展:策略与实践
- 手术室护理核心制度试题及答案
- 论王瑶卿对京剧旦角唱法的革新与传承
- 2025年上半年电力安全工作总评
- 2026年全国二级建造师之二建市政工程实务考试绝密预测题附答案
- 《小学科学三年级上册“自制量杯”探究式教案》
- (2026年)哺乳期乳房损伤的防护培训课件
- (2026年)c3-膜性肾病的发病机制进展课件
- 2026药品GSP认证实践测试试题及答案
- 四川省达州2026年八年级下学期语文期末试题附答案
- DBJ53T-44-2021云南省建筑工程资料管理规程
- 鲁南制药就业协议书
- 施工项目机械租赁服务方案
- 海外出国劳务合同8篇
- 《宠物饲养管理》课件-宠物犬生殖系统解剖生理特点
- 贵州省遵义市(2024年-2025年小学六年级语文)统编版小升初模拟((上下)学期)试卷及答案
- 《中国心力衰竭诊断和治疗指南2024》解读(下)
- 侵袭性肺曲霉病课件
- 电梯维保人员奖惩制度
- 商务英语专业四级
- 煤矿淘汰设备目录(全六批)
评论
0/150
提交评论