Visual C++网络编程经典案例详解 第7章 邮件收发器 接收邮件 代码分析

    xiaoxiao2022-07-13  151

    对SendCmdAndRecv()的功能代码进行分析 自定义函数原型 void SendCmdAndRecv(int x)

    如果函数调用成功 将在程序窗口相应的控件中进行显示

    该函数含有一个参数x 表示要获取的邮件序列号

    用户调用函数时需要指定该参数 一般情况下 当程序启动时 参数x从1开始计数

    函数将"RETR" 命令与参数x格式化后再发送到服务器 代码如下

    ... //省略部分代码 n=x; //将参数值赋予该类中变量n CString str; //调用字符串用于构造命令 char recvdata[1024]={0},ch[1024],ch2[1024]; //接收数据数组 str.Format("retr d%",n); //格式化字符串 str+="\r\n"; //添加回车换行符 send(s,str.GetBuffer(1),sizeof(str),0); //发送获取邮件命令 ... //省略部分代码

    在代码中 首先调用字符串对象 然后根据参数将字符串格式化以后 通过函数send()发送到服务器

    在格式化命令字符串时 一定需要记住在命令最后必须加上符号"\r\n" 因为这样才能使服务器知道客户端发送的命令结束

    如果服务器接收并执行命令以后 将返回客户端所请求的相应邮件内容

    这时 客户端程序调用函数recv()进行接收并且在代码中实现数据分析

    代码如下

    ... if(recv(s,recvdata,1024,0)) { if(recvdata[] =='O' && recvdata[1]=='K') { recvdata[sizeof(recvdata)+1]="\0"; maliadd=recvdata[]; while(i=maliadd.Find("from:")!=-1 || i<mailadd.Find("\r\n")) //循环查找 { ch[i++]=recvdata[i++]; } GetWindowText(IDC_NAME)->SetWindowText(&ch); if(i=mailadd.Find("\n")!=-1) { ch2[i++]=recvdata[i++]; GetWindowText(IDC_EDIT1)->SetWindowText(&ch); } else { MessageBox("接收失败!"); } } }

    当客户端成功接收到邮件数据后 由于服务器执行成功以后会返回OK 所以客户端需要判断数据中前两个字符是否是OK 然后在接收的数据最后添加字符 “\0” 表示将接收到的字符数据转换为字符串

    字符串转换成功以后 程序调用CString类的函数Find()查找相应的标题字头获取邮件信息

    通过在字符串中查找回车符号"\n" 将字符串指针定位到邮件内容处 最后通过循环将邮件内容显示到程序窗口中

    最新回复(0)