これは心の摘み合いだ。。。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Visual C++ を使用して MFC アプリケーション内のスレッド間でソケット接続を渡す方法
------------------------------------------------------------------------------------------------------------------------------------------
概要
この資料では、MFC アプリケーションのスレッド間でソケット接続を渡す方法をサンプルで示します。サンプルはサーバーとクライアントの 2 つのプロジェクトで構成されています。サーバーは接続ごとに新規スレッドを作成してクライアントと通信します。
詳細
サーバー
サー バーでは、MFC アプリケーションの複数のスレッドでソケットを使用する方法を示します。サーバーは接続要求を待ちます。新しい接続が要求されるとそれを受け付け、接続を 処理するスレッドを作成します。サーバーがメッセージを受信した場合は、そのメッセージを反転してクライアントに送り返します。MFC では、新しい接続の場合は、リスニング ソケットのあるスレッドで接続を受け付ける必要があります。Accept の呼び出しは CAsyncSocket オブジェクト内で渡す必要があります。その後 MFC により、接続がスレッドで処理されるように、すべての情報が適切にセットアップされます。この接続を別のスレッドで処理する場合は、そのスレッドに MFC オブジェクトを渡すだけでは正常に機能しません。別のスレッドで接続が処理されるようにすべてを適切にセットアップするには、以下の手順を実行する必要が あります。
1. | 接続を受け付けたスレッドで、CAsyncSocket オブジェクトからソケット ハンドルをデタッチします。 |
2. | ソケット ハンドルをスレッドに渡します。 |
3. | スレッドで、このハンドルを CAsyncSocket 派生オブジェクトにアタッチします。 |
サーバー プロジェクトから抜き出した次のコードは、これを示したものです。
リスニング ソケットでの OnAccept
void CListensoc::OnAccept(int nErrorCode)スレッドの InitInstance
{
// New connection is being established
CSocket soc;
// Accept the connection using a temp CSocket object.
Accept(soc);
// Create a thread to handle the connection.
// The thread is created suspended so that we can
// set variables in CConnectThread before it starts executing.
CConnectThread* pThread =
(CConnectThread*)AfxBeginThread(
RUNTIME_CLASS(CConnectThread),
THREAD_PRIORITY_NORMAL,
0,
CREATE_SUSPENDED);
...
// Pass the socket to the thread by passing the socket handle.
// You cannot pass a CSocket object across threads.
pThread->m_hSocket = soc.Detach();
// Now start the thread.
pThread->ResumeThread();
CAsyncSocket::OnAccept(nErrorCode);
}
BOOL CConnectThread::InitInstance()上記のコードにより、ソケットが 2 番目のスレッドに適切にセットアップされます。
{
...
// Attach the socket handle to a CSocket object.
// This makes sure that the socket notifications are sent
// to this thread.
m_socket.Attach(m_hSocket);
...
}
------------------------------------------------------------------------------------------------------------------------------------------
msdnより。
わかったような、わからないような。。。
PR
この記事にコメントする