Режим «Split Packet» при обработке данных TCP
Из отзывов клиентов Tibbo узнала, что иногда нужно знать размер отдельных пакетов TCP. Например, некоторые методы шифрования данных работают на уровне пакетов: сотрите границу между пакетами TCP - и данные не расшифровать.
Свойство sock.splittcppackets и событие on_sock_tcp_packet_arrival, появившиеся в Tibbo BASIC/C V2.0, позволяют обрабатывать входящие данные TCP пакет за пакетом. Для этого установите sock.splittcppackets = 1 - YES. После этого событие on_sock_tcp_packet_arrival будет генерироваться для каждого входящего пакета TCP, несущего новые данные (то есть не повторно переданные). Пример использования:
dim rx_tcp_packet_len as word 'to keep the size of the next incoming TCP packet
sub on_sys_init
...
rx_tcp_packet_len=0
sock.splittcppackets=YES
end sub
sub on_sock_tcp_packet_arrival(len as word)
rx_tcp_packet_len=len 'we get the size of the next packet we are going to process
end sub
sub on_sock_data_arrival
dim s as string
'take exactly the contents of one packet (we assume that it can fit in the string!)
s=sock.getdata(rx_tcp_packet_len)
rx_tcp_packet_len=0 'very important!
end sub
Разумеется, может понадобиться и управление размером исходящих пакетов TCP. Это делается иначе. При sock.splittcppackets = 1 - YES, когда вы помещаете данные в буфер TX и выполняете sock.send, сокет не отправит эти данные, если всё содержимое буфера TX не умещается в один пакет TCP. Вот пример, как этим можно воспользоваться:
sock.splittcppackets=YES
...
...
sock.setdata("ABCDEFGH1234567890")
sock.send
while sock.txlen>0
doevents
wend
Заметьте, что у этого способа есть недостаток - снижается пропускная способность, потому что программа ждёт подтверждения для каждого отправляемого пакета TCP. С другой стороны, это надёжный способ убедиться, что исходящий пакет TCP содержит именно те данные, которые вы задумали.
Будьте осторожны: не пытайтесь отправить больше данных, чем размер буфера RX на другой стороне. В этом режиме сокет не отправит данные, пока не сможет отправить их все целиком, и ваше соединение TCP застрянет!
Кроме того, попытка отправить пакет размером больше «максимального размера сегмента» (MSS), заданного другой стороной, приведёт к фрагментации данных! Сокет никогда не отправит пакет TCP с объёмом данных, превышающим MSS.
Режим Split Packet несовместим с TLS. Если его включить, отправляемые и принимаемые зашифрованные данные будут повреждены.