C言語関係掲示板

過去ログ

No646 winsockを使いSMTPサーバへ接続する時

[戻る] [ホームページ]
No.6988

winsockを使いSMTPサーバへ接続する時
投稿者---はろはろ(2003/06/02 03:06:13)


今Win2k上で、winsockを使って、メール機能を付けたプログラムを組んでいます。

そこで下記のようなコードを組んで見ました。

#define PORT 25

    SOCKET hsocket;         //WinSockソケット
    LPHOSTENT hostent;      //サーバ情報の構造体
    SOCKADDR_IN sockaddr;   //IPアドレスとポート番号

    if(!(hostent = gethostbyname("サーバ名")))
        return 0;

    hsocket = socket(PF_INET, SOCK_STREAM, 0);
    if(hsocket == INVALID_SOCKET)
        return 0;

    //サーバへ接続する。
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = PORT;
    sockaddr.sin_addr = *((LPIN_ADDR)*hostent->h_addr_list);
    if(connect(hsocket, (PSOCKADDR)&sockaddr, sizeof(sockaddr))){
        MessageBox(hwnd, "サーバーソケットに接続失敗", "Error", MB_OK);
        return 0;
    }


これは、SMTPサーバへ接続することを旨としているのですが、
接続する際、ポート25ではなく、6400へ接続しに行きます。

しかし、ポートをPORT6400とすると、きちんとポート25で接続するようです。
なぜこうなるのか、全く分かりません。

どなたか分かる方いらっしゃいましたらよろしくお願いします。

No.6991

Re:winsockを使いSMTPサーバへ接続する時
投稿者---shelly(2003/06/02 04:33:45)


ホストバイトオーダーとネットワークバイトオーダーの違いです。
ホストバイトオーダーでは最下位のバイトが先に配置されますが、
ネットワークバイトオーダーでは最上位のバイトが先に配置されます。

25という値はホストバイトオーダーだと、2進数で
00000000 00011001
のように表現できますが、ネットワークバイトオーダーでは
00011001 00000000
のように、8bitで逆転します。
もうお気づきかと思いますが、ネットワークバイトオーダーの25=ホストバイトオーダーの6400ということです。

sockaddr.sin_portにはネットワークバイトオーダーで指定してやる必要が
あるので、htonsを使って
 sockaddr.sin_port = htons(25)
と指定してやれば、ネットワークバイトオーダーで25がはいります。


No.6992

Re:winsockを使いSMTPサーバへ接続する時
投稿者---はろはろ(2003/06/02 05:20:13)


そう言えば、TCP・UDPのヘッダにはポート番号を含まれているのでしたね。
バイトオーダーの取り決めがなければリトルエンディアンのマシンと、
ビッグエンディアンのマシンで通信が出来なくなるのは自明の理です。

しかしおかげで無事解決することが出来ました。

まだまだ分からないことも多く、ちょくちょく顔を出すかも知れませんが、
よろしくお願いします。

本当にありがとうございました。