Укажите размер пакета с помощью Ruby TCPSocket - PullRequest
1 голос
/ 02 ноября 2009

Я использую Ruby для тестирования сетевого приложения C #, которое использует сокеты. Я открываю соединение с @socket = TCPSocket.new(IP,PORT), и оно работает - пока текст, который я хочу отправить, не будет длиннее 1024 символов. Затем Руби разбивает сообщение на 2 части. C ++ и C # отправляют сообщение как один пакет, поэтому приложению C # не нужно объединять части.

Сообщения никогда не становятся длиннее прибл. 2000 символов Есть ли возможность установить размер пакета для TCPSocket?

EDIT: Все ваши ответы верны, но после прочтения большого количества рубиновых вопросов здесь, на SO, я нашел решение:

socket.send(msg,0x4)

не разбивает сообщение. Опция прямой отправки имеет значение.

Я не знаю, работает ли это через Интернет, но работает в моей тестовой лаборатории.

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

TCP - это потоковый протокол. Он не заботится о «сообщениях» приложения. TCP теоретически может отправить ваши 1024 байта в одном пакете или в 1024 пакетах. Тем не менее, имейте в виду, что Ethernet MTU составляет 1500 байтов. Коэффициент в IP-заголовок , который обычно равен 20, и TCP-заголовок , который составляет не менее 20. Тогда ваше сообщение длиной в 2000 символов должно быть отправлено как минимум в двух пакетах. TCP также осуществляет управление потоками, что может иметь отношение к проблеме. Лучший способ узнать, что происходит на проводе, это использовать tcpdump или wireshark .

0 голосов
/ 02 ноября 2009

Количество пакетов, необходимых для передачи ваших данных, должно практически не влиять на поток. То, с чем вы можете столкнуться, является проблемой буферизации в вашей реализации.

Сокет должен быть записан только в том случае, если он находится в состоянии «записи», в противном случае вы рискуете переполнить выходной буфер и вызвать разрыв соединения вашим сетевым стеком.

Поскольку сокет TCP / IP функционирует как простой поток, в который данные поступают и распределяются по порядку, эффект фрагментации пакетов должен быть в основном неактуальным, за исключением крайне чувствительных ко времени приложений.

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

@socket.write(my_data)
@socket.flush
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...