10022 Статус завершения на RIOSend

Я пытаюсь заставить RIO-сервер отправлять запрошенные данные клиенту, но каждый раз, когда я пытаюсь сделать RIOSend, никакие данные не передаются, и я получаю состояние завершения 10022. Я могу получать запросы и распаковывать их просто отлично, просто кажется, что это доставляет мне проблемы.

Я настроил свой сокет следующим образом:

void socketSetup()
{
WSADATA data;

if (WSAStartup(0x202, &data) != 0)
Logging::LogFatal("WSAStartup failed!");

socket = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, NULL, 0, WSA_FLAG_REGISTERED_IO);

if (socket == INVALID_SOCKET)
Logging::LogFatal("Socket creation error!");

sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(socket, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr)) == SOCKET_ERROR)
Logging::LogFatal("Socket bind error!");

// Socket options.
GUID functionTableId = WSAID_MULTIPLE_RIO;
DWORD dwBytes = 0;

int result = WSAIoctl(socket, SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &functionTableId, sizeof(GUID), (void**)&rio, sizeof(rio), &dwBytes, 0, 0);

if (result != 0)
Logging::LogFatal("Socket options error!");
}

RIO тогда настроен так:

void rioSetup()
{
// Create the queues.
sendQueue = rio.RIOCreateCompletionQueue(bufferSize, 0);
receiveQueue = rio.RIOCreateCompletionQueue(bufferSize, 0);

if (sendQueue == RIO_INVALID_CQ || receiveQueue == RIO_INVALID_CQ)
Logging::LogFatal("Error creating completion queues!");

void *pContext = 0;

requestQueue = rio.RIOCreateRequestQueue(socket, bufferSize / 2, 1, bufferSize / 2, 1, receiveQueue, sendQueue, pContext);

if (requestQueue == RIO_INVALID_RQ)
Logging::LogFatal("Error creating request queue!");

// Allocate and register the buffers.
sendBuffer = reinterpret_cast<char*>(VirtualAlloc(0, bufferSize * sizeof(DataProvider::TrackingData), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));
receiveBuffer = reinterpret_cast<char*>(VirtualAlloc(0, bufferSize * dataSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE));

if (sendBuffer && receiveBuffer)
{
sendBufferId = rio.RIORegisterBuffer(sendBuffer, bufferSize * sizeof(DataProvider::TrackingData));
receiveBufferId = rio.RIORegisterBuffer(receiveBuffer, bufferSize * dataSize);

if (sendBufferId == RIO_INVALID_BUFFERID || receiveBufferId == RIO_INVALID_BUFFERID)
Logging::LogFatal("Buffer register error!");

// Slice up the receive buffer.
DWORD offset = 0;

RIO_BUF* receiveBufs = new RIO_BUF[bufferSize / 2];

for (DWORD i = 0; i < bufferSize / 2; i++)
{
RIO_BUF* pBuf = receiveBufs + i;
pBuf->BufferId = receiveBufferId;
pBuf->Offset = offset;
pBuf->Length = dataSize;

offset += dataSize;

if (!rio.RIOReceive(requestQueue, pBuf, 1, 0, pBuf))
Logging::LogFatal("Error creating receives!");
}
}
}

И после того, как получение обработано с использованием RIODequeueCompletion, я проверяю данные и отправляю ответ. Код ответа выглядит так:

void sendDataResponse(DataProvider::TrackingData data)
{
memcpy(sendBuffer + currentSendOffset, &data, sizeof(DataProvider::TrackingData));

RIO_BUF* pBuf = new RIO_BUF();
pBuf->BufferId = sendBufferId;
pBuf->Offset = currentSendOffset;
pBuf->Length = sizeof(DataProvider::TrackingData);

currentSendOffset += sizeof(DataProvider::TrackingData);

if (currentSendOffset >= bufferSize * sizeof(DataProvider::TrackingData))
currentSendOffset = 0;

if (!rio.RIOSend(requestQueue, pBuf, 1, 0, pBuf))
Logging::LogError("Error sending response!");
}

Кто-нибудь видит что-то явно очевидное? Это первый раз, когда я настраивал сокеты с нуля, и мой первый раз, когда я использую RIO, так что я уверен, что что-то здесь упущено.

Заранее спасибо.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]