Last Updated 2005/08/29
Programming Tips Visual C++ MFC ソケット  索 引 
ソケット通信
2005/08/29

CAsyncSocket および CSocket は 生成時に CSocketWnd という不可視ウィンドウを生成する.このウィンドウに WM_SOCKET_NOTIFY メッセージが通知され,LPARAM にイベントがセットされている.そのイベントが FD_ACCEPT なりである.
FD_ACCEPT であれば OnAccept() が呼ばれる.(いわゆるコールバック関数)
CAsyncSocket::OnAccept() などは実体が空なのでオーバーライドして使用する.


CSocket はブロッキングをクラス内部で管理しているから OnSend コールバックは発生しないとヘルプには書かれているが,CSocket は CAsyncSocket の派生クラスであるから OnSend をオーバーライドすれば呼ばれる.
最初に1回呼ばれるのは,送信準備が整ったからである.

OnReceive コールバックは,WinSock から WM_SOCKET_NOTIFY メッセージを受け取った時に呼ばれる.(受信において FD_READ イベントが発生した時)
WM_SOCKET_NOTIFY メッセージは CSocketWnd が処理を行う.
1回の recv() で受信済みデータを取りきれない場合は,再度 FD_READ が発生する.
(つまり,再度 OnReceive が呼ばれる)

テクニカルリーフの「CSocket w/CArchive を使用す時の余剰 FD_READ によるブロック」が参考になる.


参照
前後のTips
ソケット通信

DSS ProgrammingTipsCGI Ver2.01