В моем однопоточном приложении я использую
SDLNet_CheckSockets -> SDLNet_SocketReady -> SDLNet_TCP_Recv
цепочка для получения пакетов без блокировки. Я использую 512 в качестве размера буфера при вызове SDLNet_TCP_Recv
, И большую часть времени пакеты хорошо вписываются в это. Но что, если я получу несколько пакетов одновременно? Или большие пакеты?
SDLNet_TCP_Recv
несколько раз, потому что я не знаю, будет ли это блокировать или нет. Если данных больше нет, они блокируются. Если я получу один пакет, который точно соответствует размеру моего буфера, я не буду знать, ожидают ли их больше или нет.SDLNet_SocketReady
после каждого SDLNet_TCP_Recv
звонок не работает. Это только возвращает true
первый раз. Потом возвращается false
даже когда на самом деле есть больше данных для чтения (проверил это вслепую SDLNet_TCP_Recv
когда SDLNet_SocketReady
возвращенный false
).SDLNet_CheckSockets
после каждого SDLNet_TCP_Recv
звонок выглядит для меня как очень странный вариант. Конечно, это не так? Почему я должен учитывать ВСЕ сокеты каждый раз, когда я читаю еще несколько байтов из одного сокета? Это разрушает структуру классов моей программы и требует грязных хаков для работы.Все учебники и примеры, которые я вижу, не касаются возможности того, что сокет может получить больше данных, чем его размер буфера (который обычно невелик). Как будто этого не происходит. Но, безусловно, это происходит, веб-сокеты могут выражать свой размер с помощью 64-разрядного целого числа. Я не хочу выделять столько, если не знаю, что должен. И, опять же, несколько небольших пакетов могут просто складываться.
Как мне подойти к этому?
Использование UDP не вариант, так как я имею дело с веб-сокетами.
Задача ещё не решена.
Других решений пока нет …