Unix domain Socket

Unix域socket并不是用于不同主机的客户和服务器之间通信的套接字,它实际上是一个在单个主机上执行客户/服务器的通信方法,可以说是进程间IPC。

 

但是它和通常的通信套接字还是有些许不同的:

首先就是使用的套接字地址不同

unix domain socket 使用的是sockaddr_un,而不是sockaddr_in.

sockaddr_un结构如下:

struct sockaddr_un
{
  sa_family_t sun_family;               /*PF_UNIX或AF_UNIX */
  char sun_path[UNIX_PATH_MAX];       /* 路径名 */
};

该结构体指定了一个具体的文件,用于实现进程间的通信,有点像双向管道。

 

还有一点就是它和正常UDP通信的不同之处在于:客户端若想服务器向其发送信息,则必须要调用bind函数,否则服务器在recvfrom函数中是获取不到客户端的sockaddr_un的。这是理所应当的嚒!!客户端没有指定明确的路径,服务器肯定没法确定客户的地址了的。

 

但是!但是在一般的通信udp socket中,客户端若不绑定ip和端口地址,服务器是可以获得对端连接的客户的通信地址的。这是因为客户端,虽然没有绑定sockaddr_in地址,但是linux 内核会自动为udp填充报文送出接口的ip,并自动选择一个可用端口。这样udp报文就能够被构造起来了。

 

通常服务端这边是会绑定ip和端口的,但是不bind也不会出错。因为内核也会进行自动选择,但是这样服务器端口号就是随机的了,而服务器端口自身本来就是要众所周知的。这样客户端才能够与之进行通信,若服务器端口随机,那么客户端也无法确定服务端的端口号了,从而无法通信。

 

unix domain socket会在bind函数创建socket文件,且若在调用bind函数之前,已存在指定的同名的socket文件,那么会造成bind失败,所以在bind签,最好使用unlink函数先删除socket文件。

更多信息请参见:

unp 15c

你可能感兴趣的:(Unix domain Socket)