The Unix domain protocols are not an actual protocol suite, but a way of performing
client/server communication on a single host using the same API that is used for clients
and servers on different hosts. The Unix domain protocols are an alternative to the
interprocess communication (IPC) methods, when the client and server are on the same host.
Two types of sockets are provided in the Unix domain: stream sockets (similar to TCP)
and datagram sockets (similar to UDP). Even though a raw socket is also provided, its
semantics have never been documented, it is not used by any program that the authors are
aware of, and it is not defined by POSIX.
struct sockaddr_un {
sa_family_t sun_family; /* AF_LOCAL */
char sun_path[104]; /* null-terminated pathname */
};
The POSIX specification does not define the length of the sun_path array and it specifically
warns that applications should not assume a particular length. Use the sizeof operator to find
the length at run-time and to verify that a pathname fits into the array. The length is likely
to be between 92 and 108 rather than a larger value big enough to hold any pathname. The reason
for these limits is an implementation artifact dating back to 4.2BSD requiring that this structure
fit in a 128-byte mbuf (a kernel memory buffer).
The pathname stored in the sun_path array must be null-terminated. The macro SUN_LEN is provided
and it takes a pointer to a sockaddr_un structure and returns the length of the structure, including
the number of non-null bytes in the pathname. The unspecified address is indicated by a null string
as the pathname, that is, a structure with sun_path[0] equal to 0. This is the Unix domain equivalent
of the IPv4 INADDR_ANY constant and the IPv6 IN6ADDR_ANY_INIT constant.
POSIX renames the Unix domain protocols as "local IPC," to remove the dependence on the Unix OS.
The historical constant AF_UNIX becomes AF_LOCAL. Nevertheless, we still use the term "Unix domain"
as that has become its de facto name, regardless of the underlying OS. Also, even with POSIX attempting
to make these OS-independent, the socket address structure still retains the _un suffix!
Notice: the file path used to communicate must be created by receiver using bind(). The sender can not
invoke unlink() delete the path. It will cause sendto() or recvfrom() errors.