Приём данных в режиме UDP

В предыдущем разделе мы объясняли, как принимать данные, когда сокет работает в режиме TCP. В этом разделе описан приём данных по UDP.

Использование события on_sock_data_arrival

В UDP входящие данные, как правило, по-прежнему обрабатываются по событию on_sock_data_arrival. Но есть два отличия:

  • Каждый раз при входе в обработчик события on_sock_data_arrival вы можете обработать только одну датаграмму UDP из ожидающих в буфере RX. Если не использовать специальный метод (см. ниже), данные следующей датаграммы получить не удастся, даже если она уже лежит в буфере RX.
  • Если, находясь в обработчике события on_sock_data_arrival, вы не прочитали «текущую» датаграмму целиком и вышли из обработчика, непрочитанная часть датаграммы отбрасывается.

Пример: допустим, в буфере RX ожидают две датаграммы с содержимым «ABC» и «123»; следующий код тогда выполнится дважды:

sub on_sock_data_arrival
dim s as string(2)
s = sock.getdata(255) ' will get 2 bytes as this is the capacity of s
end sub

Поскольку максимальный размер s равен 2, при первом выполнении s = sock.getdata(255) вы получите «AB». При выходе из обработчика события остаток первой датаграммы UDP будет отброшен, так что в следующий раз вы получите «12»!

Использование метода sock.nextpacket

Обработка входящего потока данных по событию on_sock_data_arrival - предпочтительный способ. Тем не менее в некоторых случаях данные RX нужно обрабатывать в цикле, не выходя из обработчика события.

Для такого случая и существует метод sock.nextpacket. Результат его выполнения эквивалентен выходу из обработчика события on_sock_data_arrival и повторному входу в него: непрочитанная часть предыдущей датаграммы UDP отбрасывается, и происходит переход к следующей датаграмме UDP (если она есть).

Вот пример кода, в котором все входящие данные UDP обрабатываются без выхода из обработчика события:

dim s as string
...
l1:
while sock.rxlen = 0
	doevents 'good practice: let other events execute while we are waiting
wend
sock.nextpacket 'Now we know that we do have data, 'move to' the next UDP datagram. This is like entering the on_sock_data_arrival.
s = sock.getdata(255) 'get data
goto l1
...
Исходный материал Tibbo обновлён 11 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке