Как обнаружить отключение на сервере IOCP, используя нулевой байт recv - PullRequest
0 голосов
/ 11 января 2019

В настоящее время я внедряю IOCP-сервер для игры и пытаюсь использовать метод нулевого байта recv.

У меня 3 вопроса.

  1. Если вы знаете об отключении от клиента, проверив, равен ли bytestransferred 0, то как вы различаете завершение приема и отключение?

  2. Я не выполняю неблокированный режим recv(), когда я обрабатываю фактический процесс приема, потому что клиенты сначала отправляют байты фактических данных, поэтому я знаю, сколько байтов я получаю. Нужно ли использовать неблокируемый режим recv()?

Я делаю это так.

InputMemoryBitStream incomming;
std::string data;
uint32_t strLen = 0;

recv(socket, reinterpret_cast<char*>(&strLen), sizeof(uint32_t), 0);
incomming.resize(strLen);
recv(socket, reinterpret_cast<char*>(incomming.getBufferPtr()), strLen, 0);
incomming.read(data, strLen);

(InputMemoryBitStream предназначен для чтения сжатых данных.)

  1. Я динамически распределяю per io data каждый раз, когда выполняю WSARecv() и WSASend(), и освобождаю их, как только заканчиваю обработку завершенных операций ввода-вывода. Неэффективно ли это делать? или это приемлемо? Должен ли я повторно использовать per io data может быть?

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

...