Unix Domain Sockets datagram client with receive only
Solution 1:
When it comes to datagrams, there is no real client or server. Either side attempting to send is responsible for addressing datagrams to the other. So, in your code, the setup is all wrong. You're apparently attempting to direct the "server" (but really not a server, just the other peer) to send to you via svaddr
but that isn't how it works.
For a datagram AF_UNIX
socket, the sender either needs to explicitly specify the receiver's address in a sendto
call, or it needs to first connect
its socket to the receiver's address. (In the latter case, it can then use send
instead of sendto
since the peer address has been specified via connect
.)
You can't specify the sending peer's address in the recvfrom
call. The socket address argument in the recvfrom
is intended to return to you the address from which the datagram was sent. Whatever is in that variable will be overwritten on successful return from recvfrom
.
One way datagram peer programs are often structured: the "server" creates a well-known path and binds to it, then a "client" creates its own endpoint and binds to it (constructing a unique socket address for itself), then the client can sendto
the server's well-known socket. The server, by using recvfrom
to obtain the client's address along with the datagram, can then use sendto
along with the address to return a message to the client (without needing to connect
its socket). This provides a sort of client-server paradigm on top of the fundamentally equal-peer orientation of the datagram socket.
Finally, I should mention that it's usually a good idea to use fully specified pathnames to ensure both peers are using the same address even if started from different directories. (Normally, with AF_UNIX
, the address is a path name in the file system used to "rendezvous" between the two peers -- so without a full path "some_socket" is "./some_socket" in the current working directory. Some systems, such as linux, also support an abstract "hidden" namespace that doesn't require a full path, but you must use an initial null byte in the name to specify that.)