Невозможно получить доступные байты из сокета домена unix

Я отправляю N байтов из сокета домена unix (AF_UNIX, SOCK_DGRAM) другому. Однако, если я прочитал X байтов из другого сокета, где X ‹N, последует вызов read () блоков, и я не смогу получить остальные N-X байтов.

Это ожидаемое поведение для сокетов домена unix? Остальные N-X байтов выброшены ядром. Есть ли решение, например, вариант розетки?


person Benji Mizrahi    schedule 24.03.2016    source источник
comment
Что это за сокеты - UDP или TCP?   -  person SergeyA    schedule 24.03.2016
comment
Я использую сокет (AF_UNIX, SOCK_DGRAM)   -  person Benji Mizrahi    schedule 24.03.2016


Ответы (1)


Наблюдаемое вами поведение не является специфическим для AF_UNIX сокетов. Это характерно для SOCK_DGRAM сокетов. Отличительное свойство сокетов дейтаграмм состоит в том, что они ориентированы на сообщения.

В отличие от сокетов TCP, каждый раз, когда вы вызываете send() или sendto() в сокете дейтаграммы, вы создаете одно сообщение. Вы должны прочитать все сообщение за один recv() или recvfrom() вызов. Все, что не было прочитано, отбрасывается, и при следующем вызове recv() вы получите следующее сообщение в сети.

Если требуется потоковая связь, вместо нее следует использовать SOCK_STREAM.

person SergeyA    schedule 24.03.2016