Как принимает recv?

Есть 2 приложения: сервер и клиент. Клиент читает данные из файла, добавляет в начало свой заголовок и посылает пакет. Сервер не знает заранее сколько будет принято данных ( знает что точно не больше 5000), поэтому делает recv со значением буфера равным 5000. Но получается такая ситуация, что клиент посылает 5 раз по 1000 байт, а сервер читает за раз 5000 байт, тем самым склеивая посылаемые данные клиента, что делать не надо.
Так вот вопрос: как сделать так, чтобы я принимал ровно столько, сколько данных послал клиент, без какого-либо склеивания.
Пишу на C по linux, используемые функции recv/send, код приводить смысла не вижу, т.к там 10 строчек...
  • Вопрос задан
  • 724 просмотра
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Используя TCP/IP -- никак. Указывайте длину данных в своём заголовке на сервере, а на клиенте получайте заголовок и читайте столько данных, сколько там записано.
Ответ написан
Комментировать
Olej
@Olej
инженер, программист, преподаватель
Так вот вопрос: как сделать так, чтобы я принимал ровно столько, сколько данных послал клиент, без какого-либо склеивания.

Если это TCP (указывать надо!), то там нет понятия "пакет", а если нужно - то вы должны организовывать сообщение сами, оно должно быть самоопределённое:
- либо содержать втначале поле длины, а затем само сообщение (как POST)
- либо заканчиваться предопределённым ограничителем (обычно "\n\n")
Детали см. Сетевое программирование в Linux
Ответ написан
Комментировать
@abcd0x00
Вообще, там есть средства для проверки сокета на активность. Можно поставить временной порог для отличия частей одной записи от разных записей. Но теоретически это ненадёжно.

Так что используй TLV
https://en.wikipedia.org/wiki/Type-length-value
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы