Python / Twisted - фрагментация TCP-пакетов? - PullRequest
5 голосов
/ 20 января 2009

В Twisted при реализации метода dataReceived, похоже, нет примеров, относящихся к фрагментации пакетов. На любом другом языке это то, что вы реализуете вручную, поэтому мне просто интересно, сделано ли это для вас уже в крученом виде или как? Если так, нужно ли мне ставить префикс перед заголовком? Или я должен сделать это вручную? Если да, то как это будет?

Ответы [ 3 ]

6 голосов
/ 20 января 2009

При работе с TCP вы должны действительно забыть о понятии «пакеты». TCP является потоковым протоколом - вы передаете данные, а данные - с другой стороны. После того, как данные отправлены, им разрешено поступать в таком количестве или в нескольких блоках, как они хотят, при условии, что все данные поступают в правильном порядке. Вам придется вручную выполнять разделение, как и в других языках, с полем длины, полем типа сообщения или специальным символом-разделителем и т. Д.

6 голосов
/ 20 января 2009

В методе dataReceived вы возвращаете данные в виде строки неопределенной длины, что означает, что это может быть целое сообщение в вашем протоколе или оно может быть только частью сообщения, отправленного вам каким-либо «клиентом». Вам нужно будет проверить данные, чтобы убедиться, что они содержат в сообщении целое сообщение.

В настоящее время я использую Twisted в одном из своих проектов для реализации протокола и решил использовать модуль struct для упаковки / распаковки моих данных. Протокол, который я реализую, имеет фиксированный размер заголовка, поэтому я не создаю никаких сообщений, пока не прочту хотя бы количество байтов HEADER_SIZE. Общий размер сообщения объявляется в этой части данных заголовка.

Полагаю, вам не нужно определять длину сообщения как часть вашего протокола, но это помогает. Если вы не определили его, вы должны иметь специальный разделитель, который определяет, когда сообщение начинается / заканчивается. В некотором роде протокол FIX использует байт SOH для разделения полей. Хотя в нем есть обязательное поле, в котором указывается длина сообщения (но не количество полей в сообщении).

2 голосов
/ 03 мая 2009

Вы также можете использовать протокол LineReceiver

...