Я пишу многопоточный клиент, который использует порт завершения ввода-вывода.
Я создаю и подключаю сокет с установленным атрибутом WSA_FLAG_OVERLAPPED.
if ((m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
throw std::exception("Failed to create socket.");
}
if (WSAConnectByName(m_socket, L"server.com", L"80", &localAddressLength, reinterpret_cast<sockaddr*>(&localAddress), &remoteAddressLength, &remoteAddress, NULL, NULL) == FALSE)
{
throw std::exception("Failed to connect.");
}
Я связываю порт завершения ввода-вывода с сокетом.
if ((m_hIOCP = CreateIoCompletionPort(reinterpret_cast<HANDLE>(m_socket), m_hIOCP, NULL, 8)) == NULL)
{
throw std::exception("Failed to create IOCP object.");
}
Кажется, все идет хорошо, пока я не попытаюсь отправить данные через сокет.
SocketData* socketData = new SocketData;
socketData->hEvent = 0;
DWORD bytesSent = 0;
if (WSASend(m_socket, socketData->SetBuffer(socketData->GenerateLoginRequestHeader()), 1, &bytesSent, NULL, reinterpret_cast<OVERLAPPED*>(socketData), NULL) == SOCKET_ERROR && WSAGetLastError() != WSA_IO_PENDING)
{
throw std::exception("Failed to send data.");
}
Вместо того, чтобы возвращать SOCKET_ERROR с последней ошибкой, установленной на WSA_IO_PENDING, WSASend немедленно возвращается.
Мне нужно, чтобы ввод-вывод был отложен, а его завершение обрабатывалось в моей функции потока, которая также является моим рабочим потоком.
unsigned int __stdcall MyClass::WorkerThread(void* lpThis)
{
}
Я делал это раньше, но я не знаю, что в этом случае не так, я был бы очень признателен за любые усилия, которые помогут мне решить эту проблему.