Здравствуйте, maks-nelipa, Вы писали:
MN>Есть серверное приложение и клиентские приложения. Если на клиентском приложении подряд отправить несколько сообщений (send) 50 байт. То на сервере при получении сообщения (read) читается сразу все 100 байт. Как сделать так чтобы read читал каждый раз только столько байт сколько в однома сообщении?
Сообщения имеют длину строго 50 байт? Почему бы тогда в read не читать ровно 50 байт?
read склеивает сообщения которые читаются с сокета.
Есть серверное приложение и клиентские приложения. Если на клиентском приложении подряд отправить несколько сообщений (send) 50 байт. То на сервере при получении сообщения (read) читается сразу все 100 байт. Как сделать так чтобы read читал каждый раз только столько байт сколько в однома сообщении?
Re: read склеивает сообщения которые читаются с сокета.
Здравствуйте, maks-nelipa, Вы писали:
MN>Есть серверное приложение и клиентские приложения. Если на клиентском приложении подряд отправить несколько сообщений (send) 50 байт. То на сервере при получении сообщения (read) читается сразу все 100 байт. Как сделать так чтобы read читал каждый раз только столько байт сколько в однома сообщении?
Три варианта:
1. Перейти на SCTP.
2. Держать свои буфера и перед сообщением передавать его длину.
3. Обломиться.
(UDP и прочую негарантированность не считаем.)
Других вариантов нет, можете даже не пытаться искать.
The God is real, unless declared integer.
Re[2]: read склеивает сообщения которые читаются с сокета.
N>1. Перейти на SCTP.
тут надо не забывать уточнять, что SCTP не поддерживается в Windows.
N>(UDP и прочую негарантированность не считаем.)
IMHO UDP — может быть подходящим вариантом, если сразу в архитектуру заложить маловероятную потерю пакетов, для большинства приложений это возможно.
Да пребудет с тобою сила
Re[3]: read склеивает сообщения которые читаются с сокета.
Здравствуйте, TarasCo, Вы писали:
TC>IMHO UDP — может быть подходящим вариантом, если сразу в архитектуру заложить маловероятную потерю пакетов, для большинства приложений это возможно.
Стивенс У.Р. и др., "UNIX: разработка сетевых приложений", 3-е изд.:
Для первого издания этой книги автор написал для проверки этого клиента сервер UDP, который случайным образом игнорировал пакеты. Теперь он не используется. Нужно только соединить клиент с сервером через Интернет, и тогда нам почти гарантирована потеря некоторых пакетов!
Re: read склеивает сообщения которые читаются с сокета.
Здравствуйте, maks-nelipa, Вы писали:
MN>Есть серверное приложение и клиентские приложения. Если на клиентском приложении подряд отправить несколько сообщений (send) 50 байт. То на сервере при получении сообщения (read) читается сразу все 100 байт. Как сделать так чтобы read читал каждый раз только столько байт сколько в однома сообщении?
Общее решение задачи — это конечный автомат-парсер, разбирающий входящие данные на пакеты. Для того чтобы это было возможно надо продумать структуру пакетов, чтобы можно было "выдирать" их из входящего потока данных. Вообще структура пакетов, порядок их передачи и логика ответов на них определяет протокол передачи данных прикладного уровня по модели OSI.
Re[4]: read склеивает сообщения которые читаются с сокета.
Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, TarasCo, Вы писали:
TC>>IMHO UDP — может быть подходящим вариантом, если сразу в архитектуру заложить маловероятную потерю пакетов, для большинства приложений это возможно.
MC>Стивенс У.Р. и др., "UNIX: разработка сетевых приложений", 3-е изд.: MC>
MC>Для первого издания этой книги автор написал для проверки этого клиента сервер UDP, который случайным образом игнорировал пакеты. Теперь он не используется. Нужно только соединить клиент с сервером через Интернет, и тогда нам почти гарантирована потеря некоторых пакетов!
Можно "вручную" подтверждать прием пакетов по UDP, но это как из пушки по воробьям — лучше все таки разобраться с TCP.
Re[2]: read склеивает сообщения которые читаются с сокета.
Здравствуйте, Mr.Cat, Вы писали:
MC>Вы про то, что read() может прочитать меньше, чем указано? Ну так надо проверять, сколько он прочитал — и дочитывать.
Так обычно и делается. Я думал, Вы про то, что read() на сокете можно заставить считать весь буфер за один раз.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)