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 によるブロック」が参考になる. 参照 |
|