IOCP を使用するクライアント アプリケーションに取り組んでいます。
I/O ごとのデータ クラスは、WSAOVERLAPPED から派生しています。
class IoRequest : public WSAOVERLAPPED
{
...
};
非同期 I/O 操作を実行するときは、次のように使用します。
{ // WSASend - this is done in my main thread.
IoRequest *pIoRequest = new IoRequest;
pIoRequest->SetSocket(m_socket);
pIoRequest->SetBuffer(vecCommandData);
pIoRequest->SetOperationType(OP_TYPE_SEND);
WSASend(m_socket, pIoRequest->GetWsaBuffer(), 1, NULL, 0, pIoRequest, NULL);
}
{ // WSARecv - this is done in my I/O worker thread.
GetQueuedCompletionStatus(m_hIocp, &dwNumberOfBytesTransferred, &ulCompletionKey, (LPOVERLAPPED*)&pIoRequest, INFINITE);
...
WSARecv(pIoRequest->GetSocket(), pIoRequest->GetWsaBuffer(), 1, NULL, &(pIoRequest->GetFlags()), pIoRequest, NULL);
...
}
IoRequest インスタンスをワーカー スレッド ルーチンで再利用します。I/O ごとのデータを管理するために生のポインタの代わりに std::shared_ptr を使用しても問題はありませんか?
したがって、WSASend() の場合は次のようになります。
std::shared_ptr<IoRequest> spIoRequest(new IoRequest);
spIoRequest->SetSocket(m_socket);
spIoRequest->SetBuffer(vecCommandData);
spIoRequest->SetOperationType(OP_TYPE_SEND);
WSASend(m_socket, spIoRequest->GetWsaBuffer(), 1, NULL, 0, spIoRequest.get(), NULL);
乾杯