Использование буферов в режиме 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.