Связь через VB.Net, получение необычных данных - PullRequest
0 голосов
/ 24 февраля 2011

Я пытаюсь связаться с локальным приложением AS3 Air на моем ПК через сокеты.В этом случае приложение VB.Net выступает в качестве сервера, а приложение Air является клиентом.

Приложение .Net отправляет данные каждые 25 мс в приложение Air.Я не отправлял никаких сообщений о прекращении.Я просто получаю данные в приложении Air и обрабатываю их.

На принимающей стороне, когда я отлаживаю данные, я вижу, что некоторые переходы были объединены.* последовательно для большинства случаев я получаю "ABCDEF" однако в некоторых случаях я получаю "ABCDEFABCDEF"

Возможно ли, что базовая сеть TCP объединяет данные и затем отправляет их как один пакет.Неужели мне действительно нужно отправить какой-нибудь терминатор сообщений, например, такой как "ABCDEF$", а затем разделить мои сообщения на принимающей стороне?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Можете ли вы установить для NoDelay значение True в сокете?

Алгоритм Nagle разработан для сокращения сетевого трафика, заставляя сокет буферизовать небольшие пакеты, а затем объединятьи отправить их в одном пакете при определенных обстоятельствах.Пакет TCP состоит из 40 байтов заголовка плюс отправляемые данные.Когда небольшие пакеты данных отправляются по протоколу TCP, издержки, возникающие из заголовка TCP, могут стать значительной частью сетевого трафика.В сильно загруженных сетях перегрузка, возникающая из-за этих издержек, может привести к потере дейтаграмм и повторных передач, а также к чрезмерному времени распространения, вызванному перегрузкой.Алгоритм Nagle запрещает отправку новых сегментов TCP, когда новые исходящие данные поступают от пользователя, если ранее переданные данные по соединению остаются неподтвержденными.

1 голос
/ 24 февраля 2011

Из документации для Socket.Send :

Также нет гарантии, что отправленные вами данные немедленно появятся в сети.Для повышения эффективности сети базовая система может задерживать передачу до тех пор, пока не будет собран значительный объем исходящих данных.Успешное завершение метода Send означает, что в базовой системе есть место для буферизации ваших данных для сетевой отправки.


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

Т.е. представьте, что вам нужно получить два сообщения - "AAAAAA" и "BBBBBBBB".Вы можете получить следующее от трех отдельных вызовов Receive (после добавления $ в качестве маркера конца сообщения):

AAAA
AAAA$BB
BBBBBB$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...