Twisted> Как прочитать сообщение TCP длиннее, чем длина кадра TCP, например 1380 байт из окна TCP-клиента - PullRequest
3 голосов
/ 22 июля 2011

Я пишу скрученный сервер для чтения TCP-сообщений размером до 64 КБ. Я обнаружил, что mt datareciever вызывался классом linereciever каждые 1380 байт, что оказалось размером кадра TCP клиента Windows. Есть ли способ обойти это без необходимости циклически проходить эти блоки по 1380 байт?

from twisted.internet.protocol import Protocol
from twisted.internet.protocol import Factory
from twisted.enterprise.adbapi import ConnectionPool
class CSVReceiver(Protocol):
    def dataReceived(self, line):
        print 'line RX :', len(line) , ' : ' , str(line)

DataReceived вызывается и печатается каждые 1380 байт, например, 4X, когда на наш сервер отправляется TCP-сообщение размером 6 КБ. Любой способ избежать этого, чтобы мы могли обработать всю строку в одном обратном вызове?

Спасибо.

STAN

Ответы [ 2 ]

1 голос
/ 22 июля 2011

TCP отправляет потоки данных, а не сообщения. Посредническая сеть может разбить ваши потоки на сколь угодно маленькие куски для транспорта. Если у вас есть контроль над всей сетью, в которой это происходит, вы можете настроить свои клиенты Windows , чтобы иметь другой размер окна. Но тогда вам также может потребоваться специально настроить локальный маршрутизатор для поддержки Jumbo frames , поскольку даже Ethernet не поддерживает кадры с длиной более 1500 октетов по умолчанию.

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

1 голос
/ 22 июля 2011

Вы задавали этот вопрос на python_forum, я вам там ответил. Вы хотите использовать LineReciever и хотите установить MAX_LENGTH на большее число.

...