ローカルPOP3サーバを作る(その1)

サンデープログラマになろうと宣言しておきながら、今週末は私用で外出してしまうので、平日に試したことを書く。
まずは、Formを作ってからSocket接続を受けることが出来るか実験した。とりあえず、すぐに情報が見つかったWinsockから試してみる。人のページに記載されていることをそのままコピーしただけです。実験なので。
フォーム表示と同時にPop3Sクラスを生成する。

private:
Pop3S^ pop3s;
private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
	 pop3s = gcnew Pop3S();
}

その、Pop3Sクラスは実験用にコピペしただけ。

#include <winsock2.h>
public ref class Pop3S
{
public:
	Pop3S(void);
private:
};

#pragma comment(lib, "WS2_32.LIB")
extern "C" {
int ttest()
{
	WSADATA wsaData;
	SOCKET sock0;
	struct sockaddr_in addr;
	struct sockaddr_in client;
	int len;
	SOCKET sock;
 // winsock2の初期化
	WSAStartup(MAKEWORD(2,0), &wsaData);
 // ソケットの作成
	sock0 = socket(AF_INET, SOCK_STREAM, 0);
 // ソケットの設定
	addr.sin_family = AF_INET;
	addr.sin_port = htons(12345);
	addr.sin_addr.S_un.S_addr = INADDR_ANY;
	bind(sock0, (struct sockaddr *)&addr, sizeof(addr));
 // TCPクライアントからの接続要求を待てる状態にする
	listen(sock0, 5);
 // TCPクライアントからの接続要求を受け付ける
	len = sizeof(client);
	sock = accept(sock0, (struct sockaddr *)&client, &len);
 // 5文字送信
	send(sock, "HELLO", 5, 0);
 // TCPセッションの終了
	closesocket(sock);
 // winsock2の終了処理
	 WSACleanup();
    return 0;
}
};
Pop3S::Pop3S(void)
{
	ttest();
}

で、コンパイルしてtelnetでアクセスしてみる。

telnet localhost 12345

HELLO

ホストとの接続が切断されました。

と表示されたので、とりあえず動くことは確認した。その後の動作がおかしいのは、適当に作りすぎているからだと思う。多分、開放が出来ていない。