|
MFC非同期ソケット(サーバ編1)
今回はCAsyncSocketクラスを使った非同期ソケットでサーバソケットを作成します。
非同期ソケットのほうが、より高度なプログラムになります。初めてMFCのソケットを使うのであれば、まずMFCソケット通信の基本
(クライアント編)、MFCソケット通信の基本 (サーバ編)を見てください。
今回もプロジェクトをダイアログベースで作成します。MFCアプリケーションウィザードで"Windowsソケット"をチェックします。また、今回も簡単のためUNICODEのサポートはしません。
ダイアログは次のようなものを作りました。"待ち受け"ボタンが押されると、指定のポートでクライアントからの接続を受け付けます。クライアントから接続要求が来たら、接続を確立し、データを送受信します。

エディットボックスにはいつも通りDDX変数、ボタンにはBN_CLICKEDのイベントハンドラを追加しました。(これらの使い方については、ボタンの基本、エディットボックスの基本等を見てください。)
次はCAsyncSocketの派生クラスを作ります。クラスビューから追加→クラスを選択します。

基本クラスにCAsyncSocketを選択し、クラス名を入力し、完了を押します。

次は、必要なコールバック関数をオーバーライドします。作成したクラスのプロパティから、箱?のアイコンをクリックし、オーバーライドする関数を選択します。ここではOnAccept()、OnSend()、OnReceive()の3つを選択しました。

さて、クライアントの場合は、ダイアログクラスとコネクション用のソケットクラスだけでしたが、サーバの場合はさらに待ち受け用のソケットクラスがあり、複数のクライアントの同時接続をサポートする場合は、コネクション用のソケットは複数用意しないといけません。クラス構造はどのように作ればよいのでしょうか。
ここでは、次のような構造にします。待ち受け用のソケットクラスは、1つだけなので、ダイアログクラスのメンバに持ちます(包含)。コネクション用のソケットは、接続時に動的に作成する方が適しているでしょう。こちらは動的生成するので、クラスメンバにポインタで持ちます。
ダイアログデータの読み書きは、やはりダイアログクラス内で行いたいので、ダイアログクラスにOnAccept()、OnSend()、OnReceive()関数を追加し、ソケットクラスのコールバックからは、この関数を呼び出してもらいます。
コールバックを呼び出してもらうため、ソケットクラスのコンストラクタとCreate()関数をオーバーライドして、ダイアログクラスのthisポインタを渡すようにします。データ処理やUIの処理をダイアログクラスに集中させた形になります。
必ずこのようにしないといけないということではありません。あくまで一例だと思ってください。
では、ダイアログクラスのメンバにソケットクラスを追加します。ダイアログクラスを右クリックし、追加→変数の追加を選択します。

変数の種類に作成したソケットクラスを入力し、変数名を入力し、完了を押します。

次は、ダイアログクラスにコールバック関数を追加します。ダイアログクラスを右クリックし、追加→関数の追加を選択します。

OnAccept()、OnSend()、OnReceive()をそれぞれ追加します。この関数は外部から呼ばれるので、publicにします。ソケットクラスと同じように、int型の引数nErrorCodeをそれぞれ追加します。

次に、非同期サーバソケットの待ち受けの方法を解説します。
同期ソケットと同じように、Create()でソケットを作成、Listen()でソケットを待ち受けモードにします。このあとは、クライアントから接続要求が来ると、OnAccept()が呼び出されるので、OnAccept()関数の中でAccept()を呼んで、コネクションを確立します。

コネクションを確立した後のデータ送受信方法は、クライアントと変わりません。
今回はここで一区切りにしましょう。次回は実際にコードの編集をします。
|