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. -- Eric Blake ebl...@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature