Несколько чтений из неблокирующих SDLNet_TCP_Recv

В моем однопоточном приложении я использую

SDLNet_CheckSockets -> SDLNet_SocketReady -> SDLNet_TCP_Recv

цепочка для получения пакетов без блокировки. Я использую 512 в качестве размера буфера при вызове SDLNet_TCP_Recv, И большую часть времени пакеты хорошо вписываются в это. Но что, если я получу несколько пакетов одновременно? Или большие пакеты?

  1. Я не могу слепо позвонить SDLNet_TCP_Recv несколько раз, потому что я не знаю, будет ли это блокировать или нет. Если данных больше нет, они блокируются. Если я получу один пакет, который точно соответствует размеру моего буфера, я не буду знать, ожидают ли их больше или нет.
  2. призвание SDLNet_SocketReady после каждого SDLNet_TCP_Recv звонок не работает. Это только возвращает true первый раз. Потом возвращается false даже когда на самом деле есть больше данных для чтения (проверил это вслепую SDLNet_TCP_Recv когда SDLNet_SocketReady возвращенный false).
  3. призвание SDLNet_CheckSockets после каждого SDLNet_TCP_Recv звонок выглядит для меня как очень странный вариант. Конечно, это не так? Почему я должен учитывать ВСЕ сокеты каждый раз, когда я читаю еще несколько байтов из одного сокета? Это разрушает структуру классов моей программы и требует грязных хаков для работы.

Все учебники и примеры, которые я вижу, не касаются возможности того, что сокет может получить больше данных, чем его размер буфера (который обычно невелик). Как будто этого не происходит. Но, безусловно, это происходит, веб-сокеты могут выражать свой размер с помощью 64-разрядного целого числа. Я не хочу выделять столько, если не знаю, что должен. И, опять же, несколько небольших пакетов могут просто складываться.

Как мне подойти к этому?

Использование UDP не вариант, так как я имею дело с веб-сокетами.

1

Решение

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

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

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

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