第95章 実際にPOP3サーバに接続する


POP3サーバに接続するプログラムの前準備は前章で行いました。 必要な関数などの解説もしました。



今回は、実際にPOP3サーバに接続するプログラムを作ります。

接続したら、サーバーからどのような返事が来るかも観察します。 接続に成功したら"QUIT"コマンドを送信してすぐに接続を切って終了します。

何かばかばかしいようなプログラムですが、この方法がわかるといろいろと応用 が効くようになります。

では、さっそくプログラムを見てみましょう。

// pop01.cpp

#include <stdio.h>
#include <winsock2.h>

int main()
{
    char szServer[64], szBuf[1024], szPort[8];
    u_int port;
    WSADATA wsaData;
    int nRtn;
    SOCKET s;
    SOCKADDR_IN saddr;
    HOSTENT *lpHost;
    unsigned int addr;

    printf("POP3サーバー---");
    gets(szServer);
    printf("ポート番号---");
    gets(szPort);
    if (strcmp(szPort, "") == 0)
        strcpy(szPort, "110");
    port = (u_int)atoi(szPort);
    printf("ポート番号を%dに設定しました\n", port);

    nRtn = WSAStartup(MAKEWORD(1, 1), &wsaData);
    if (nRtn != 0) {
        perror("WSAStartupp失敗です\n");
        return -1;
    }
    s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == INVALID_SOCKET) {
        perror("ソケット作成失敗\n");
        WSACleanup();
        return -2;
    }

    lpHost = gethostbyname(szServer);
    if (lpHost == NULL) {
        addr = inet_addr(szServer);
        lpHost = gethostbyaddr((char *)&addr, 4, AF_INET);
        wsprintf(szBuf, "%sが見つかりません\n", szServer);
        perror(szBuf);
        return -3;
    }
    memset(&saddr, 0, sizeof(SOCKADDR_IN));
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(port);
    saddr.sin_addr = *((LPIN_ADDR)*lpHost->h_addr_list);

    if (connect(s, (PSOCKADDR)&saddr, sizeof(saddr)) != 0) {
        perror("サーバーソケットに接続失敗\n");
        closesocket(s);
        WSACleanup();
        return -4;
    }

    memset(szBuf, '\0', sizeof(szBuf));
    recv(s, szBuf, (int)sizeof(szBuf) - 1, 0);
    printf(szBuf);

    if (strstr(szBuf, "+OK") != szBuf) {
        perror("サーバーは+OKを返しませんでした\n");
    }

    strcpy(szBuf, "QUIT\r\n");
    send(s, szBuf, (int)strlen(szBuf), 0);

    memset(szBuf, '\0', sizeof(szBuf));
    recv(s, szBuf, (int)sizeof(szBuf) - 1, 0);
    printf(szBuf);

    closesocket(s);
    WSACleanup();

    return 0;
}

WSAStartup関数でWinsockの初期化をして、socket関数でソケットを作成します。 ここまでは、たいていのプログラムで同じ手順を踏みます。

gethostbyname関数でホスト情報を取得します。ユーザーがサーバー名でなく IPアドレスで指定した場合は失敗します。 失敗したら、inet_addr関数で変換してからgethostbyaddrを呼び出します。

SOCKADDR_IN構造体に必要事項をセットして、connect関数で、接続を確立します。 あとは、send, recv関数でやりとりをするだけです。

POP3サーバーにコマンドを送るときは末尾に「\r\n」を付加します。 コマンドが成功したら「+OK ****」の返事が来ます。

では、さっそく実行してみましょう。 この例では、LAN内に設置してあるPOP3サーバを利用しています。 インターネット上のサーバーでも同じです。

ポート番号を聞かれた時に、何も入力せずにエンターキーを押すと自動的に110に設定 されるようになっています。




[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/04/2004 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。