On Mon, Mar 14, 2011 at 3:44 PM, Eric Blake <ebl...@redhat.com> wrote:
> On 03/14/2011 08:39 AM, Paolo Bonzini wrote:
>> On 03/14/2011 03:02 PM, Bastien ROUCARIES wrote:
>>>> >
>>>> >      recv(socket, buf, 512) =>  return 17, buf = "getfd\n0x12345678\0"
>>>> >      parse getfd
>>>> >      recvfd fails, or even worse it blocks (possibly forever)
>>>> >      even if recvfd doesn't block, parsing 0x12345678\0 fails
>>> Why ? It is like sending and receiving data throught a protocol. i
>>> will emulate AF_UNIX by tcp socket over localhost with TCP_NODELAY
>>
>> No, that's exactly the _wrong_ reason for TCP_NODELAY.  You simply
>> cannot expect message boundaries to be respected when using SOCK_STREAM.
>>
>> So, either sendfd/recvfd must be documented to work only on SOCK_DGRAM
>> sockets, or they have to be rethought (if possible at all).
>
> Note that just last week libvirt found an issue with SOCK_STREAM hanging
> forever on recvfd when the sendfd side was skipped, but SOCK_DGRAM was
> able to reliably detect when the sending side of the socket is closed.
> I'm perfectly fine with documenting that sendfd/recvfd must be used on
> SOCK_DGRAM only.

Will work for me

Bastien

Reply via email to