zoukankan      html  css  js  c++  java
  • POP3协议学习笔记

    今日得闲,于是将POP3的学习笔记也整理出来!

    互联网上的TCP/IP,POP3/SMTP等资料多如牛毛,这里只是自己一点点心得,另外对于各位网络方面的大牛请安静的路过,我可不喜欢在关公面前耍大刀...

    (还是那句,我比较喜欢用实践来证明一切,这样才会加深自己的理解!)

     一、准备工作:

    1、本机环境:Windows XP SP3、公司ADSL 10M光纤

    2、开发工具:WildPackets OmniPeek V5.1.4

                        Visual C++ 6.0

                        Outlook Express6.0

                        FlexEdit V2.3.1871

     二、SMTP命令:
    1、USER username
    2、PASS password
    3、STAT 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
    4、LIST 返回邮件数量和每个邮件的大小
    5、RETR [Msg#] 返回由参数标识的邮件的全部文本
    6、DELE [Msg#] 服务器将由参数标识的邮件标记为删除,由quit命令执行
    7、RSET 服务器将重置所有标记为删除的邮件,用于撤消DELE命令
    8、NOOP 服务器返回一个肯定的响应
    9、QUIT 更新

    三、分析数据包:

    1、打开Outlook Express6.0,选择POP协议,内容如下:

    POP3

    2、开始捕获后点击“接收邮件”,内容如下:

    Packets

    3、前面的数据包信息、以太网信息、IP头、TCP头就不用介绍了吧!

         数据包中包含到的命令都打圈标记了,下面是LIST返回的数据包:

    List

    4、下面是UIDL返回的数据包,邮件唯一的标示:

    UIDL

    5、其他小技巧

         <CR> <LF>即对应C/C++中的"/r /n"

    四、相关代码:

    1、以下代码通过socket与POP3服务器建立连接并读取邮件列表、原文等。

         打开Visual C++,新建一个控制台工程、并添加一个CPP文件:

    1. /************************************************************************/  
    2. /* main.cpp  POP3协议学习笔记 - 连接POP3、读取邮件列表、读取邮件原文 
    3. /* by Koma 2009.9.10 14:10 
    4. /* http://blog.csdn.net/wangningyu 
    5. /************************************************************************/  
    6. #include "stdio.h"    
    7. #include "winsock2.h"      
    8. #pragma comment(lib,"ws2_32.lib")      
    9.   
    10. int main(int argc, char* argv[])  
    11. {  
    12.     SOCKADDR_IN saServer;  
    13.     LPHOSTENT   lphostent;  
    14.     WSADATA     wsadata;  
    15.     SOCKET      hsocket;  
    16.       
    17.     int     nRet;  
    18.     char*   host_name="pop.tom.com";  
    19.     char*   req=  
    20.         // 两行是登录用户与密码(以明文的方式发送)   
    21.         "USER ningyusky@tom.com/r/n"  
    22.         "PASS w*****/r/n"  
    23.         "STAT/r/n"      // 获取信箱状态   
    24.         "LIST/r/n"      // 获取所以邮件列表信息   
    25.         "UIDL 1/r/n"    // 获取邮件1的唯一标识符   
    26.         "RETR 3/r/n"    // 从服务器读取出邮件3原文   
    27.         "QUIT/r/n";     // 退出连接   
    28.       
    29.     // 初始化套接字   
    30.     if(WSAStartup(MAKEWORD(2,2),&wsadata))     
    31.         printf("初始化SOCKET出错!");  
    32.       
    33.     // SMTP端口默认是110   
    34.     lphostent=gethostbyname(host_name);     
    35.     if(lphostent==NULL)     
    36.         printf("lphostent为空!");  
    37.     hsocket   =   socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);     
    38.     saServer.sin_family = AF_INET;     
    39.     saServer.sin_port = htons(110);     
    40.     saServer.sin_addr = *((LPIN_ADDR)*lphostent->h_addr_list);  
    41.       
    42.     // 利用SOCKET连接   
    43.     nRet = connect(hsocket,(LPSOCKADDR)&saServer,sizeof(SOCKADDR_IN));     
    44.     if(nRet == SOCKET_ERROR)     
    45.     {     
    46.         printf("建立连接时出错!/n");     
    47.         closesocket(hsocket);     
    48.         return 0;     
    49.     }  
    50.       
    51.     // 利用SOCKET发送   
    52.     nRet = send(hsocket,req,strlen(req),0);  
    53.     if(nRet==SOCKET_ERROR)  
    54.     {  
    55.         printf("发送数据包时出错!");  
    56.         closesocket(hsocket);  
    57.     }  
    58.       
    59.     char   Dest[20000];  
    60.     memset(Dest,0,20000);  
    61.     nRet=1;     
    62.     while(nRet>0)     
    63.     {  
    64.         // 接收返回数据包   
    65.         nRet=recv(hsocket,(LPSTR)Dest,sizeof(Dest),0);     
    66.         if(nRet>0)     
    67.             Dest[nRet]=0;     
    68.         else     
    69.             Dest[0]=0;  
    70.         // 显示返回数据包的大小、内容   
    71.         printf("/n返回数据包大小:%d/n",nRet);     
    72.         printf("返回数据包内容:/n%s",Dest);     
    73.     }  
    74.     return 0;  
    75. }  
     

    2、程序运行效果:

    运行效果

  • 相关阅读:
    HDU 1317 XYZZY(floyd+bellman_ford判环)
    UVa 10791 最小公倍数的最小和(唯一分解定理)
    UVa 12169 不爽的裁判
    UVa 11582 巨大的斐波那契数!(幂取模)
    POJ 1142 Smith Numbers(分治法+质因数分解)
    HDU 1595 find the longest of the shortest
    UVa 11090 在环中
    UVa 10917 林中漫步
    UVa 11374 机场快线
    POJ 1503 Integer Inquiry
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332958.html
Copyright © 2011-2022 走看看