Чтение из сокета
От: Echer  
Дата: 07.06.05 14:39
Оценка:
При чтении пакетов из сокета, работающего по протоколу TCP, необходимо помнить о 'безразмерности' TCP-пакета (к примеру, сначала отсылать размер самого пакета а потом сам пакет). Просмотрел большое количество примеров на тему работы с сокетами в .NET и нигде не нашел упоминания об этом. Создается впечатление что нужно просто запустить TcpListener, прицепить к нему NetworkStream и будем всегда получать то что отправили. Так ли это?
Re: Чтение из сокета
От: Hobot Bobot США  
Дата: 07.06.05 14:44
Оценка: 21 (1)
Здравствуйте, Echer, Вы писали:

E>При чтении пакетов из сокета, работающего по протоколу TCP, необходимо помнить о 'безразмерности' TCP-пакета (к примеру, сначала отсылать размер самого пакета а потом сам пакет). Просмотрел большое количество примеров на тему работы с сокетами в .NET и нигде не нашел упоминания об этом. Создается впечатление что нужно просто запустить TcpListener, прицепить к нему NetworkStream и будем всегда получать то что отправили. Так ли это?


Насколько я знаю — да. Но обычно надо знать что вся необходимая информация получена и надо начинать ее обрабатывать. Для этого и используется либо заранее переданный размер либо контрольное значение в конце пакета.
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Re[2]: Чтение из сокета
От: Nickolay Ch  
Дата: 07.06.05 15:45
Оценка: 2 (1)
Здравствуйте, Hobot Bobot, Вы писали:

HB>Здравствуйте, Echer, Вы писали:


E>>При чтении пакетов из сокета, работающего по протоколу TCP, необходимо помнить о 'безразмерности' TCP-пакета (к примеру, сначала отсылать размер самого пакета а потом сам пакет). Просмотрел большое количество примеров на тему работы с сокетами в .NET и нигде не нашел упоминания об этом. Создается впечатление что нужно просто запустить TcpListener, прицепить к нему NetworkStream и будем всегда получать то что отправили. Так ли это?


HB>Насколько я знаю — да. Но обычно надо знать что вся необходимая информация получена и надо начинать ее обрабатывать. Для этого и используется либо заранее переданный размер либо контрольное значение в конце пакета.


TcpListener и NetworkStream просто более удобные обертки над сокетами, в частонсти позволяющие работать с сокетом как с потоком. Однако это не меняет того, что TCP — является "потоковым" протоколом, т.е. не сохраняет границ сообщений при передаче. Это уже ваша задача(Задача протокола уровня приложения), как определять границы сообщений. .Нет обертки ее не выполняют. Единственное, что достаточно просто сделать StreamReader/Writer над сетевым потоком и использовать методы ReadLine(WriteLine), если у вас в сообщении не пристуствуют символы \n то это даст вам готовый протокол уровня приложения.
Re[3]: Чтение из сокета
От: Hobot Bobot США  
Дата: 07.06.05 15:50
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>Здравствуйте, Hobot Bobot, Вы писали:


HB>>Насколько я знаю — да. Но обычно надо знать что вся необходимая информация получена и надо начинать ее обрабатывать. Для этого и используется либо заранее переданный размер либо контрольное значение в конце пакета.


NC>TcpListener и NetworkStream просто более удобные обертки над сокетами, в частонсти позволяющие работать с сокетом как с потоком. Однако это не меняет того, что TCP — является "потоковым" протоколом, т.е. не сохраняет границ сообщений при передаче. Это уже ваша задача(Задача протокола уровня приложения), как определять границы сообщений. .Нет обертки ее не выполняют. Единственное, что достаточно просто сделать StreamReader/Writer над сетевым потоком и использовать методы ReadLine(WriteLine), если у вас в сообщении не пристуствуют символы \n то это даст вам готовый протокол уровня приложения.


Примерно это я и имел в виду.
What a piece of work is a man! how noble in reason! how infinite in faculty! in form and moving how express and admirable! in action how like an angel! in apprehension how like a god! the beauty of the world! the paragon of animals!
Re[3]: Чтение из сокета
От: Аноним  
Дата: 08.06.05 07:26
Оценка:
Здравствуйте, Nickolay Ch, Вы писали:

NC>TcpListener и NetworkStream просто более удобные обертки над сокетами, в частонсти позволяющие работать с сокетом как с потоком. Однако это не меняет того, что TCP — является "потоковым" протоколом, т.е. не сохраняет границ сообщений при передаче. Это уже ваша задача(Задача протокола уровня приложения), как определять границы сообщений. .Нет обертки ее не выполняют. Единственное, что достаточно просто сделать StreamReader/Writer над сетевым потоком и использовать методы ReadLine(WriteLine), если у вас в сообщении не пристуствуют символы \n то это даст вам готовый протокол уровня приложения.


Да, спасибо, именно это меня и интересовало. Только вот протокол уровня приложения нам все равно придется писать ))
Re[4]: Чтение из сокета
От: Nickolay Ch  
Дата: 08.06.05 07:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Nickolay Ch, Вы писали:


NC>>TcpListener и NetworkStream просто более удобные обертки над сокетами, в частонсти позволяющие работать с сокетом как с потоком. Однако это не меняет того, что TCP — является "потоковым" протоколом, т.е. не сохраняет границ сообщений при передаче. Это уже ваша задача(Задача протокола уровня приложения), как определять границы сообщений. .Нет обертки ее не выполняют. Единственное, что достаточно просто сделать StreamReader/Writer над сетевым потоком и использовать методы ReadLine(WriteLine), если у вас в сообщении не пристуствуют символы \n то это даст вам готовый протокол уровня приложения.


А>Да, спасибо, именно это меня и интересовало. Только вот протокол уровня приложения нам все равно придется писать ))


Можно сделать хмлный протокол и юзать XmlReader/Writer над NetworkStream'ом.
Re[5]: Чтение из сокета
От: Echer  
Дата: 08.06.05 08:24
Оценка:
NC>Можно сделать хмлный протокол и юзать XmlReader/Writer над NetworkStream'ом.

Да это еще вопрос: html, xml, строка с символами-разделителями или массив байтов с побитовыми операциями... )))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.