Я работаю над клиентским приложением, использующим IOCP.
Мой класс данных ввода-вывода получен из WSAOVERLAPPED:
class IoRequest : public WSAOVERLAPPED
{
...
};
И при выполнении асинхронных операций ввода-вывода я использую это так:
{ // 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 в своей процедуре рабочего потока. Интересно, не будет ли проблем с использованием 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);
Ваше здоровье