1. 程式人生 > >Socket例項1--POP3客戶端程式

Socket例項1--POP3客戶端程式

下面的程式碼例項基於POP3的客戶協議,與郵件伺服器連線並取回指定使用者帳號的郵件。
  與郵件伺服器互動的命令存在字串陣列POPMessage中,程式通過一個do-while迴圈依次傳送這些命令。
#include<stdio.h> <stdlib.h> <errno.h> <string.h> <netdb.h>
#include<sys/types.h> <netinet/in.h> <sys/socket.h>
#define POP3SERVPORT 110  #define MAXDATASIZE 4096
int main(int argc, char *argv[])
{
    int sockfd;
    char Serv_Host[] = "60.28.205.11";
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char *POPMessage[] = {
        "USER huaying.xie/r/n", //回車換行
        "PASS mypasswd/r/n",
        "STAT/r/n",
        "LIST/r/n",
        "TOP 1/r/n",
        "RETR 1/r/n",
        //"DELE 1/r/n",
        "QUIT/r/n",
        NULL
    };
    int iLength;
    int iMsg = 0;
    //int iEnd = 0;
    char buf[MAXDATASIZE];
    if((host = gethostbyname(Serv_Host)) == NULL){
        perror("gethostbyname error:");
        exit(1);
    }
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket error:");
        exit(1);
    }
    serv_addr.sin_family = PF_INET;
    serv_addr.sin_port = htons(POP3SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1){
        perror("connect error:");
        exit(1);
    }
    do{
        int iEnd = 0;
        send(sockfd, POPMessage[iMsg], strlen(POPMessage[iMsg]), 0);
        printf("have sent: %s", POPMessage[iMsg]);
        //iLength = recv(sockfd, buf+iEnd, sizeof(buf)-iEnd, 0);
        iLength = recv(sockfd, buf, sizeof(buf), 0);
        iEnd += iLength;
        buf[iEnd] = '/0';
        printf("received: %s, %d/n", buf, iMsg);
        iMsg++;
    }while(POPMessage[iMsg]);
    close(sockfd);
    return 0;
}

POP3 命令簡介(網路整理)
  POP3 (Post Office Protocol 3) 即郵局協議的第 3 個版本,它規定怎樣將個人計算機連線到 Internet 的郵件伺服器和下載電子郵件的電子協議。
      它是因特網電子郵件的 第一個離線協議標準, POP3 允許使用者從伺服器上把郵件儲存到本地主機(即自己的計算機)上,同時刪除儲存在郵件伺服器上的郵件,而POP3伺服器則是遵循 POP3 協議的接收郵件伺服器,用來接收電子郵件的。
  POP3 命令:(不區分大小寫)
    USER username 認證使用者名稱
    PASS password 認證密碼認證,認證通過則狀態轉換
    APOP name,digest 認可一種安全傳輸口令的辦法,執行成功導致狀態轉換,請參見 RFC 1321 。
    STAT 處理請求 server 回送郵箱統計資料,如郵件數、 郵件總位元組數
    UIDL n 處理 server 返回用於該指定郵件的唯一標識, 如果沒有指定,返回所有的。
    LIST n 處理 server 返回指定郵件的大小等
    RETR n 處理 server 返回郵件的全部文字
    DELE n 處理 server 標記刪除,QUIT 命令執行時才真正刪除
    RSET 處理撤消所有的 DELE 命令
    TOP n,m 處理返回 n 號郵件的前 m 行內容,m 必須是自然數
    NOOP 處理 server 返回一個肯定的響應
    QUIT 希望結束會話。如果 server 處於"處理" 狀態,則現在進入"更新"狀態,刪除那些標記成刪除的郵件。如果 server 處於"認可"狀態,則結束會話時 server 不進入"更新"狀態 。

  使用telnet 連線 Mail Server 收信
    telnet 60.28.205.40 110 ---使用 telnet 命令連線伺服器 110 埠
      Trying 119.119.119.212... --- 正在連線伺服器 110 埠
      Connected to 119.119.119.212. --- 連線伺服器 110 埠成功
      +OK Winmail Mail Server POP3 ready
    user username --- 輸入使用者名稱, username 為具體的使用者名稱 如:huaying.xie
      +OK --- 執行命令成功
    pass password --- 輸入使用者密碼,password 為具體的密碼
      +OK 2 messages --- 密碼認證通過
      (-ERR authorization failed --- 密碼認證失敗)
    stat --- 郵箱狀態
      +OK 2 6415 --- 2 為該信箱總郵件數,6415 為總位元組數
    list --- 列出每封郵件的位元組數
      +OK --- 執行命令成功,開始顯示,左邊為郵件的序號,右邊為該郵件的大小
      1 537 --- 第 1 封郵件,大小為 537 位元組
      2 5878 --- 第 2 封郵件,大小為 5878 位元組
      .
    top 1 --- 接收第 1 封郵件
      +OK --- 接收成功, 返回第 1 封郵件頭
      Return-Path: <
[email protected]
>
      Delivered-To: [email protected]
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: [email protected]
      To: [email protected]
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail
      .
    retr 1 --- 接收第 1 封郵件
      +OK --- 接收成功, 返回第 1 封郵件全部內容
      Return-Path: <
[email protected]
>
      Delivered-To: [email protected]
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: [email protected]
      To: [email protected]
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail     
      Hi, test2
      This is a test mail, you don't reply it.
      .
    dele 1 --- 刪除第 1 封郵件
      +OK --- 刪除成功
    dele 2 --- 刪除第 2 封郵件
      +OK --- 刪除成功
    quit --- 結束會話
      +OK --- 執行命令成功

相關推薦

Socket例項1--POP3客戶程式

下面的程式碼例項基於POP3的客戶協議,與郵件伺服器連線並取回指定使用者帳號的郵件。  與郵件伺服器互動的命令存在字串陣列POPMessage中,程式通過一個do-while迴圈依次傳送這些命令。#include<stdio.h> <stdlib.h> <errno.h>

使用 Socket 通訊實現 FTP 客戶程式

簡介: FTP 客戶端如 FlashFXP,File Zilla 被廣泛應用,原理上都是用底層的 Socket 來實現。FTP 客戶端與伺服器端進行資料交換必須建立兩個套接字,一個作為命令通道,一個作為資料通道。前者用於客戶端向伺服器傳送命令,如登入,刪除某個檔案,後者

python--DenyHttp項目(1)--socket編程:客戶與服務器

brush accept acc -- highlight 發送消息 src size 接受 查找了許多資料,實現了客戶端與服務器端的連接,通過虛擬機進行測試 服務器端IP:192.168.37.129 端口1122 客戶端IP:  192.168.37.1 端口1122

linux下C語言程式設計日誌(1):基於TCP協議的伺服器/客戶程式

  基於TCP協議的伺服器/客戶端程式  首先我們看一下使用TCP協議進行網路通訊的程式基本模型:伺服器首先進行初始化操作:呼叫函式socket建立一個套接字,函式bind將這個套接字與伺服器的公認地址繫結在一起,函式listen將這個套接字換成傾聽套接字,然後呼叫函式acc

如何使用C實現MQTT+TLS客戶程式1)--使用mosquitto搭建MQTT伺服器

前言 這是一個使用C語言實現的MQTT/TLS的客戶端程式,主要應用在各類嵌入式產品。如果想使用在Android裝置上,讀者可以參考Paho mqtt。 簡單介紹MQTT MQTT遙測傳輸(MQ Telemetry Transport,MQT

簡易socket 多線程客戶 服務器

bre handle lose cli connect oca mat exce send 簡易客戶端: import socket client = socket.socket() client.connect((‘localhost’,9999)) while

8.1 構建客戶總體流程

lib encoding tty ann dem 關系 zkclient 緩存 tom 一 示例 1 配置文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns:xsi="http://

Socket編程實現客戶與服務器一對一聊天

bug servers sys 編程 獲取 post edr class 一個 Socket(套接字) 使用Socket編程實現數據的交互需要經歷以下幾個步驟: 1、創建Socket: Socket socket = new Socket("host",p

python多線程socket編程--多客戶接入

info name -- number fcm 版本 string itl ont Python中實現socket通信的服務端比較復雜,而客戶端非常簡單,所以客戶端基本上都是用sockct模塊實現,而服務 端用有很多模塊可以使用,如下: 1、客戶端 2、SocketSe

(已解決)c# 客戶程式訪問oracle報錯:ORA-12154: TNS: 無法處理服務名

錯誤:ORA-12154: TNS: 無法處理服務名 這個錯誤大家在百度上一搜一大把,但是我出現這個錯誤的原因跟百度不太一樣,我的客戶端程式在不同的目錄可以正常執行,但在其中1個目錄就是要出錯,因此我想到是目錄路徑中出了問題,既然是路徑那就只能是資料夾名有什麼特殊之處導致不能執行,後來發現不能執

socket.io開啟其客戶debug的方法

由於我們開發除錯需要對比我們的應用和socket.io的區別,因此我們需要除錯js版本的socket.io,以便判斷我們寫的版本和他們原版的區別。這裡看了socket.io的官方文件,瞭解瞭如何開啟socket.io的debug的方法。 最簡單的方法是 localStorag

ftp客戶程式的三個實驗

準備好兩臺互相ping通的虛擬機器 一。匿名使用者 安裝需要用的包 vim 編輯主配置檔案 vim /etc/vsftpd/vsftpd.conf 第十二行等於YES 第十五行等於NO 27行和31行的#去掉 重啟服務service vsftpd restart 到客戶機端 安裝ftp服

實現socket的服務和客戶通訊

對學習過程中自己敲的一些關於socket有關的程式碼做了個簡單總結,在這分享一下,給有需要的同學借鑑一下。 什麼是socket? 網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。 建立網路通訊連線至少要一對埠號(socket)。socke

java 使用html寫UI 做winform win桌面客戶程式(一)

大家好,今天給大家帶來使用java+html寫winform  win客戶端桌面程式的教程。 在讀本文之前你首先要能接受: 1   客戶端基於java+html所以 軟體包中需要包含 jre和 cef(chrome核心)的dll,軟體包比較大。 2 &

支援 Appium 伺服器的客戶程式庫列表

這些庫封裝了標準的 Selenium 客戶端,提供了所有 JSON Wire protocol 指定的常規 selenium 命令,額外新增操控移動裝置相關的命令,例如 多點觸控手勢 和 螢幕方向。 Appium 客戶端程式庫實現了 M

boost::asio伺服器處理多個客戶連線(客戶程式)

//客戶端程式 // //  main.cpp //  tcpserver //  Created by suxianbin on 2018/9/15. //  Copyright © 2018 suxianbin. All rights

hdfs叢集第一個客戶程式

在叢集實體機中,我們可以直接通過實體機操作hdfs系統,直接使用hdfs命令將實體機中的檔案上傳至叢集檔案系統中,但實際應用中叢集會面向客戶端操作,不再是傳統命令操作,而是通過相應的客戶端程式來執行 測試之前先注意一下幾點: 1.叢集啟動狀況,是否正常

socketserver和socket的補充(驗證客戶合法性)

hello ram cli digest hand 連接 close his imp 一、socket的補充 1、參數 socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None) 參

客戶程式設計師的工具們

人和動物的本質區別就是會製作和使用工具…… 日誌持續提升: eDiary 記錄工作筆記學習心得,可以加密,而且配置可以拷貝,非常好用,用了6年了。 檔案查詢 everything windows環境下快速檔案查詢,一個字,快。搜尋支援正則表示式。

MySQL(1)---MySQL客戶工具的選擇

最近因系統雲化專案,學習使用MySQL叢集,為了找一款順手的mysql客戶端,反覆使用了多個工具,並篩選出一個自認為最滿意的,在此分享。 先說我的選擇:SQLyog。 嘗試的客戶端:Toad for MySQL、MySQL-Front、Navicat for MySQ