Использование буферов в режиме UDP

UDP - пакетный протокол (в отличие от потокового TCP). В UDP обычно важно, какие данные к какой датаграмме (пакету) относятся. Объект sock. даёт полный контроль над отдельными датаграммами, которые вы принимаете и передаёте.

Отправка и приём данных UDP по-прежнему идут через буферы TX и RX. Разница в том, что разделение на датаграммы внутри буферов сохраняется.

У каждой датаграммы в буфере есть собственный заголовок:

  • В буфере TX заголовок содержит длину датаграммы, а также MAC-адрес, IP-адрес и порт получателя и флаг широковещательной передачи (показывает, нужно ли отправить датаграмму как широковещательную).
  • В буфере RX заголовок содержит длину датаграммы, а также MAC-адрес, IP-адрес и порт отправителя и флаг широковещательной передачи (показывает, является ли датаграмма широковещательной).

Отправка данных

Как и в TCP, отправка данных через буфер TX в режиме UDP выполняется в два шага: сначала вы помещаете данные в буфер методом sock.setdata, а затем закрываете датаграмму и выполняете саму отправку (фиксируете данные) методом sock.send.

Датаграммы никогда не смешиваются друг с другом. После вызова sock.send датаграмма закрывается и отправляется (как можно скорее). Все новые данные, добавленные в буфер TX, попадут в новую датаграмму. Например:

sock.setdata ("Foo") ' Placed our data in the tx buffer - not being sent out yet.
' ... more code...
sock.setdata ("Bar") ' Added even more data to the same datagram, waiting to be sent.
sock.send ' A datagram containing 'FooBar' will now be closed and committed for sending.
sock.setdata ("Baf") ' This new data will go into a new datagram.
sock.send ' Closes the datagram with only 'Baf' in it and commits it for sending.
sock.send ' sends an empty UDP datagram!

Обратите внимание: в примере выше пустую датаграмму удалось отправить, вызвав sock.send без sock.setdata!

Помните, что максимальная длина данных в датаграмме UDP ограничена - 1 536 байт.

Приём данных

Чтобы принимать данные в режиме UDP, нужно находиться в обработчике события поступления данных сокета либо явно перейти к следующей датаграмме UDP в буфере.

Чтобы извлечь данные из буфера, используйте метод sock.getdata. Этот метод обращается только к одной датаграмме в буфере, если не использовать метод sock.nextpacket. Если ожидает обработки несколько входящих датаграмм, их придётся обрабатывать по одной, переходя от одной к другой. Это удобно: так вы всегда знаете, где заканчивается одна датаграмма и начинается другая.

Пример:

sub on_sock_data_arrival
	dim whatigot as string
	whatigot = sock.getdata(255) 'will only extract the contents of a single datagram. Reenter the on_sock_data_arrival to get the next datagram
end sub

Данные можно извлечь из буфера только один раз: после извлечения их в буфере уже нет.

Данные в буфере RX можно и просмотреть, не извлекая их. Для этого служит метод sock.peekdata.

Приём данных UDP продолжается в разделе Приём данных в режиме UDP.

Исходный материал Tibbo обновлён 11 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке