В настоящее время я внедряю IOCP-сервер для игры и пытаюсь использовать метод нулевого байта recv.
У меня 3 вопроса.
Если вы знаете об отключении от клиента, проверив, равен ли bytestransferred
0, то как вы различаете завершение приема и отключение?
Я не выполняю неблокированный режим 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 предназначен для чтения сжатых данных.)
- Я динамически распределяю
per io data
каждый раз, когда выполняю WSARecv()
и WSASend()
, и освобождаю их, как только заканчиваю обработку завершенных операций ввода-вывода. Неэффективно ли это делать? или это приемлемо? Должен ли я повторно использовать per io data
может быть?
Заранее спасибо.