TCP ведет себя странно - PullRequest
0 голосов
/ 05 декабря 2011

Я программирую свой собственный TCP-клиент, и он ведет себя немного странно.

Работа клиента заключается в проверке, является ли последний байт полученных байтов символом \ 0.Если это так, он преобразует предыдущие данные в буфере в текст и инициирует событие с этим текстом в качестве аргумента события.

Однако, если я пытаюсь отправить 2 строки одновременно, происходит что-то странное.В этом случае они фактически получают как одну строку, что странно, если вы спросите меня.

Как я могу это исправить?

Я не включил примеры кода, так как это было бы довольнобольшой, чтобы включить.Если вы настаиваете, добавьте комментарий и запросите его, и я опубликую его.

Ответы [ 4 ]

5 голосов
/ 05 декабря 2011

Если вы передаете две строки через один и тот же сокет из двух разных потоков, то да, они будут чередоваться. Для этого вам нужна какая-то синхронизация потоков (в .NET это должен делать оператор lock()) или два разных сокета.

2 голосов
/ 05 декабря 2011

TCP - это поток, поэтому то, что вы описываете, совершенно нормально, когда вы отправляете несколько пакетов с одной стороны соединения, другая сторона может получать все одновременно.

Хорошо, ядро ​​Windows находится вФакт борьбы с вами в этом, так как он пытается как можно больше для объединения пакетов.Если вы хотите отключить это (он называется алгоритмом Nagle) со стороны, отправляющей данные:

TcpClient client = // something
client.NoDelay = true;

Но TCP всегда будет представлять поток, поэтому вы должны быть готовы к этому.

В вашем случае это означает, что вы должны проанализировать возвращенную строку, найти все '\0' и отправить событие для каждого из них.

2 голосов
/ 05 декабря 2011

Возможно, я ошибаюсь, но я подозреваю, что вы фактически отправили строку без нуля (символ \ 0).

Когда ваш клиент получил данные, он автоматически добавляет нулевой символ для построения строки.

Итак, когда вы отправляете 2 строки одновременно, они объединяются без нулевого символа.На принимающей стороне он восстанавливается как одна строка с одним нулем.

Попробуйте отправить данные с len + 1 или заполните строку нулевым символом перед отправкой.

0 голосов
/ 05 декабря 2011

Это:

Однако, если я пытаюсь отправить 2 строки одновременно, происходит нечто странное.

уже есть решение. Не отправляйте их одновременно. Поставьте в очередь вторую строку, завершите ее после первой. Это кстати. совершенно не проблема сети - API сокетов просто не является атомарным и потокобезопасным по определению.

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