Есть 2 приложения: сервер и клиент. Клиент читает данные из файла, добавляет в начало свой заголовок и посылает пакет. Сервер не знает заранее сколько будет принято данных ( знает что точно не больше 5000), поэтому делает recv со значением буфера равным 5000. Но получается такая ситуация, что клиент посылает 5 раз по 1000 байт, а сервер читает за раз 5000 байт, тем самым склеивая посылаемые данные клиента, что делать не надо.
Так вот вопрос: как сделать так, чтобы я принимал ровно столько, сколько данных послал клиент, без какого-либо склеивания.
Пишу на C по linux, используемые функции recv/send, код приводить смысла не вижу, т.к там 10 строчек...
Используя TCP/IP -- никак. Указывайте длину данных в своём заголовке на сервере, а на клиенте получайте заголовок и читайте столько данных, сколько там записано.
Так вот вопрос: как сделать так, чтобы я принимал ровно столько, сколько данных послал клиент, без какого-либо склеивания.
Если это TCP (указывать надо!), то там нет понятия "пакет", а если нужно - то вы должны организовывать сообщение сами, оно должно быть самоопределённое:
- либо содержать втначале поле длины, а затем само сообщение (как POST)
- либо заканчиваться предопределённым ограничителем (обычно "\n\n")
Детали см. Сетевое программирование в Linux
Вообще, там есть средства для проверки сокета на активность. Можно поставить временной порог для отличия частей одной записи от разных записей. Но теоретически это ненадёжно.