ソケット通信プログラム(LanTest)



■ 概略説明
ソケット通信のサンプルプログラムです。ソケット通信はインターネットにも使用される代表的なプロセス間通信のうちの一つです。私の経験ではソケット通信はわかりやすく、なおかつMFCの場合はカプセル化されているのでとても容易です。ソケット通信も他のプロセス間通信と同様にサーバー側のプロセスととクライアント側のプロセスに分かれます。
>使用方法は、まずサーバーとなるプログラムを起動し、タイプをサーバーにし[OK]を選びます。ポートアドレスは取りあえずデフォルトでいいと思います。これでサーバー側の準備は整いました。
次にクライアントとなるプログラム(同じEXEです)を起動し、タイプをクライアントにし[OK]を選びます。ポートアドレスはサーバーと同じです。アドレスですが1台のPC内で実行する場合はデフォルトの"localhost"のままで良いです。2台のPC(インターPC)間で通信を行う場合は、ネットワークに使用している相手方(サーバー)のPCに設定している名前を入力します。以上準備が整ったらクライアント側のプログラムの[接続]を押して下さい。上手く繋がると両プロセスの[送信]ボタンがアクティブになります。どちらかのプロセスの上部に有るエディットウィンドウに何か入力して[送信]ボタンを押してみて下さい。相手方のリストボックスにその文字が受信できればOKです。
■ プログラムの説明
ソケット通信のプロジェクトの作成方法は、プロジェクト作成時に「Windows ソケット」のチェックボックスをクリックして下さい。
ソケット通信のクラスですが、サーバー側のクラスとクライアント側のクラスに分かれています。
サーバー側のクラスは、CServerSockCSubSockですが、CSubSockCServerSockのサブクラスですので実質上はCServerSockだけと考えて良いと思います。
クライアント側のクラスは、CClientSockだけです。
>各ソケットクラスとメインとなるクラスとの通信ですが、ウィンドウメッセージを使用しています。例として受信処理を説明すると、先ず定義ですが以下のようになります。

BEGIN_MESSAGE_MAP(CLanTestDlg, CDialog)
//{{AFX_MSG_MAP(ClanTestDlg)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_CLIENT_CONNECT, OnConnected)
ON_MESSAGE(WM_SERVER_REC, OnReceive)
LONG CLanTestDlg::OnReceive( UINT wParam, LONG lParam)
{
if ( theApp.m_Port == (int)wParam)
{
CString msg;
msg.Format( ">%s", (char*)lParam);
m_cList.AddString( msg);
}
return 0L;
}
ソースを見ておわかりの通り、wParamにはポート番号が入っています。これは、通信回線を同時にオープンする時に使用します。
例えばプログラムAがサーバーで、プログラムBとプログラムCがクライアントになり、それぞれが違うポートアドレスでプログラムAと通信するような場合、プログラムAは同時に二つのCServerSockを持つわけですが、この場合はCServerSockのオブジェクトを2つ作成しそれぞれをオープンすれば良いわけです。受信ルーチンも1つで済みます。この場合は上記の受信ルーチン内のif文が2つになります。以上はクライアントに対してもまったく同じです。
PCを数台使った麻雀ゲーム等に応用できそうです。
■ファイルのダウンロード
(MFC4.2プロジェクトファィル139KB)