Я пытаюсь написать сервер IOCP. По сути, я принимаю новые соединения. В целях моего тестирования я бегу и подключаюсь к 127.0.0.1.
Я создаю псевдо-сокет до вызова AcceptEx (). Как только соединение принято, новый псевдо-сокет используется для связи. Этот новый сокет связан с портом завершения io [CreateIoCompletionPort], затем я назначаю ему несколько параметров [SO_EXCLUSIVEADDRUSE] и [SO_CONDITIONAL_ACCEPT], а затем я вызываю WSARecv () для приема входящих данных.
Проблема в том, что, когда мое удаленное соединение подключается к серверу, оно отправляет данные, но эти данные никогда не принимаются. Мне интересно, если кто-то может предложить некоторые идеи относительно того, почему он не получает данные? Возможно, моя логика ошибочна? Я прошел через мой код несколько раз. ошибок не зафиксировано.
РЕДАКТИРОВАТЬ: Исправлена формулировка. Я создаю сокет перед вызовом AcceptEx ().
Основная логика в моем коде:
// Create socket, associate with IOCP
WSASocket(af, type, proto, lpProtoInfo, g, dwFlags);
HANDLE hIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort(hSource, hIOCP, 0, 0) != NULL;
// Server bind and listen
bind(m_shSocket, pAddr, nAddrLen);
listen(m_shSocket, nBacklog);
// Creation of the pseudo socket
SOCKET s = ::WSASocket(m_iSocketAf, m_iSocketType, m_iSocketProto, m_pWpi, m_SocketGroup, m_dwSocketFlags);
DWORD dwBytes;
BOOL bRet = m_fnAcceptEx(m_shSocket, s, chOutput, 0, sizeof(SOCKADDR_STORAGE) + 16, sizeof(SOCKADDR_STORAGE) + 16, &dwBytes, m_pcbAccept);
// ... New Connection comes in, it's accepted ...
// Associate new pseudo socket with IOCP
HANDLE hNewIOCP = GetPool()->GetQueueHandle();
CreateIoCompletionPort((HANDLE) s, hNewIOCP , 0, 0) != NULL;
// ... Remote socket sends ...
// ... Remote socket and Pseudo socket call WSARecv ...
// ... Pseudo socket does not receive ...
ПРИМЕЧАНИЕ. Я попытался отправить данные из псевдо-сокета в удаленный, такая же проблема, как и при отправке данных в обратном направлении.