Таким образом, ответ на ваш вопрос в значительной степени зависит от того, используете ли вы UDP или TCP в качестве транспорта.
Для UDP жизнь становится намного проще: вы можете вызвать recv / recvfrom / recvmsg с нужным вам размером пакета (в любом случае вы, скорее всего, отправите пакеты фиксированной длины из источника), и сделайте предположение, что если данные доступны, они кратны размерам длины пакета. (I.E. Вы вызываете recv * с размером пакета отправляющей стороны, и все готово.)
Для TCP жизнь становится немного интереснее - для целей этого объяснения я буду предполагать, что вы уже знаете, как использовать socket (), bind (), listen () и accept () - последний как вы получите файловый дескриптор (FD) вашего нового соединения.
Существует два способа ввода / вывода для сокета - блокировка, при которой вы вызываете read (fd, buf, N), и чтение находится там и ждет, пока вы не прочитаете N байтов в buf - или не -блокирование, при котором вы должны проверить (используя select () или poll ()), является ли FD читаемым, и ТО делать чтение ().
При работе с TCP-соединениями ОС не обращает внимания на размеры пакетов, так как считается непрерывным потоком данных, а не отдельными кусками размера пакета.
Если ваше приложение использует «пакеты» (упакованные или распакованные структуры данных, которые вы передаете), вы должны иметь возможность вызывать read () с аргументом правильного размера и читать всю структуру данных из сокета в время. Единственное предостережение, с которым вам нужно иметь дело, это помнить, что нужно правильно упорядочить байты любых отправляемых вами данных, если исходная и целевая системы имеют разную байтовую последовательность. Это относится как к UDP, так и к TCP.
Что касается программирования * сокетов NIX, я настоятельно рекомендую У. Ричарда Стивенса «Сетевое программирование Unix, том 1» (UNPv1) и «Расширенное программирование в среде Unix» (APUE). Первая книга посвящена сетевому программированию, независимо от транспорта, а вторая является хорошей книгой по всестороннему программированию, поскольку она относится к программированию на * NIX. Также обратите внимание на «Иллюстрированный TCP / IP», тома 1 и 2.