次の方法で共有


CSocket クラス

更新 : 2007 年 11 月

CAsyncSocket の派生クラスで、Windows ソケット API のカプセル化を継承し、CAsyncSocket オブジェクトよりも高いレベルで Windows ソケット API の抽象化を表現しています。

class CSocket : public CAsyncSocket

解説

CSocket は、CSocketFileCArchive を組み合わせて動作し、データの送受信を管理します。

CSocket オブジェクトは CArchive の同期操作に欠かせないブロッキングも用意します。CSocket では、ReceiveSendReceiveFromSendToAccept (すべて CAsyncSocket から継承されます) などのブロッキング関数は WSAEWOULDBLOCK エラーを返しません。その代わりにこれらの関数は、操作の完了を待ちます。さらに、これらの関数の 1 つがブロッキング中に CancelBlockingCall が呼び出されると、元の呼び出しは WSAEINTR エラーで終了します。

CSocket オブジェクトを使うには、コンストラクタを呼び出します。その後、Create を呼び出して元になる SOCKET 型の SOCKET ハンドルを作成します。既定のパラメータの Create はストリーム ソケットを作成します。しかし、ソケットを CArchive オブジェクトと組み合わせて使わないときは、代わりのパラメータを指定してデータグラム ソケットを作成できます。あるいは、サーバー ソケットを作成するために特定のポートに連結することもできます。クライアント側では Connect を使い、サーバー側では Accept を使って接続します。その後 CSocketFile のコンストラクタで CSocketFile オブジェクトを構築して、CSocket オブジェクトに関連付けます。次に CArchive のコンストラクタで、データ送信用と (必要な場合は) 受信用の CArchive オブジェクトをそれぞれ構築して、CArchive コンストラクタ内の CSocketFile オブジェクトに関連付けます。通信が完了したら、CArchive オブジェクト、CSocketFile オブジェクトおよび CSocket オブジェクトを破棄します。SOCKET データ型については、「Windows ソケット : 予備知識」を参照してください。

CArchiveCSocketFile および CSocket と共に使用した場合、CSocket::Receive が、要求するバイト数を待機するループ (PumpMessages(FD_READ) による) に入る場合があります。これは、Windows ソケットが 1 回の FD_READ 通知につき 1 つの RECV 呼び出しのみ許可するのに、CSocketFileCSocket は FD_READ ごとに複数の RECV 呼び出しを許可するために起こる現象です。読み込むデータがない状態で FD_READ を取得した場合、アプリケーションはハングアップします。別の FD_READ を取得しない場合、アプリケーションはソケット上での通信を停止します。

この問題は次のように解決できます。ソケットから読み込まれるデータが TCP パケット 1 つのサイズを超える (ネットワーク メディアの最大伝送単位は通常 1,096 バイト以上) 場合は、メッセージ クラスの Serialize メソッドを呼び出す前に、ソケット クラスの OnReceive メソッドで、CAsyncSocket::IOCtl(FIONREAD, ...) を呼び出します。利用可能なデータが必要以下のサイズである場合は、すべてのデータを受け取るまで待機し、その後読み取り操作のみ開始します。

次の例の m_dwExpected は、ユーザーが受信すると予想されるバイト数の概数です。これをコード内のどこかで宣言していると仮定します。

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected)   // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

詳細については、「MFC における Windows ソケット」、「Windows ソケット : アーカイブ付きソケットの使用」、「Windows ソケット : アーカイブ付きソケットの動作」、「Windows ソケット : 動作シーケンス」、「Windows ソケット : アーカイブを使用するソケットの例」を参照してください。

必要条件

ヘッダー : afxsock.h

参照

参照

CAsyncSocket クラス

階層図

CAsyncSocket クラス

CSocketFile クラス

その他の技術情報

CSocket のメンバ