сокет hololens не может получить полный пакет

Простое резюме:

  • Boost Asio Server, отправьте видеокадр 720x768x3 с простым сжатием
  • размер пакета 186476, не очень много

В любом случае, ничего сложного, если я проверю это в эмуляторе hololens или на физическом устройстве

// uint32_t data_length == size of frame 'data_ptr'
enum max_length = sizeof(uint32_t);
memcpy(data_, &data_length, max_length);
auto length = boost::asio::write(*socket_, boost::asio::buffer(data_, max_length), e);
length = boost::asio::write(*socket_, boost::asio::buffer(data_ptr, data_length), e);

// receive
char data_[max_length] = { 0 };

fd_set readSet;
FD_ZERO(&readSet);
FD_SET(_socket, &readSet);
timeval timeout;
timeout.tv_sec = 0;  // Zero timeout (poll)
timeout.tv_usec = 0;

auto result = select(_socket, &readSet, nullptr, nullptr, &timeout);
if (result == 0)
continue;

result = recv(_socket, data_, max_length, 0);
if (result == SOCKET_ERROR) {
closesocket(_socket);
_socket = INVALID_SOCKET;
break;
}

uint32_t msg_size(0);
memcpy(&msg_size, data_, max_length);

std::vector<char> vec(msg_size);
result = recv(_socket, &vec[0], msg_size, 0);

while (result < msg_size) {
result += recv(_socket, &vec[result], msg_size - result, 0);
}

но hololens не может получить полный пакет, я пробую также с .net streamsockets, тот же результат. он пробовал несколько раз, а затем извлекал блоки в цикле while и больше не получал.

кто-нибудь, есть идеи? Это проблема с приложением uwp, что я не могу получить пакеты большего размера или убить его, потому что это занимает слишком много времени?

0

Решение

У вас есть две основные проблемы:

Во-первых, вам нужно проверить возвращаемое значение recv за ошибки. Если он возвращает 0 или -1, вам нужно это обработать.

Во-вторых, вы игнорируете все данные, которые вы получили от вашего первого звонка recv, Ты устанавливаешь msg_size в ноль, когда это должно быть result минус, однако, много байтов длины.

Я бы предложил написать функцию, которая читает точно указанное количество байтов, проверяя наличие ошибок. Сначала вызовите его, чтобы получить четыре байта, и проверьте, не вернулась ли ошибка. Затем вызовите его, чтобы получить количество байтов, указанное данными длины, которые вы получили.

Меньшие проблемы включают в себя:

Что делать, если первый recv возвращает только один байт?

Что если способ, которым ваша платформа хранит 32-разрядные целые числа, не совпадает с тем, как эмулятор отправляет его?

0

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

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

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