一、UNIX网络编程----UNIX域协议
UNIX域协议也就是域套接字,实在单个主机上执行客户/服务器通信的一种方法。所用API就是在不同主机上执行客户/服务器同行所用的API(套接字API)其实进程间通信(IPC)就是单个主机上的客户/服务器通信,UNIX域协议因此可视为IPC方法之一。
UNIX域套接字的优势:
1) UNIX域套接字往往比通信两端位于同一个主机上的TCP套接字快出一倍
2) UNIX域套接字可用于在同一个主机上的不同进程之间传递描述符。
3) UNIX域套接字较新的实现把客户的凭证提供给服务器,从而能够提供额外的安全检查措施。
4) UNIX域套接字用于标识客户和服务器的协议地址是普通文件系统中的路径名。Ipv4协议地址由一个32位地址和一个16位端口号构成,Ipv6协议地址则由一个128位地址和一个16位端口号构成。这些路径名不是普通的UNIX文件,除非把他们和UNIX域套接字关联起来,否则无法读取这些文件。
二、UNIX域套接字地址结构
Structsockaddr_un{
Sa_family_tsun_family;
Charsun_path[104];
}
其中UNIX域套接字的使用方法和TCP套接字的使用方法一样,也是需要绑定之类的。
三、socketpair函数
此函数创建两个随后链接起来的套接字,本函数仅适用于UNIX域套接字。
#include <sys/socket.h>
Int sockpair(intfamily,int type,int protocol,int sockfd[2]);
Family参数必须为AF_LOCAL,protocol参数必须为0.type参数既可以为SOCK_STREAM,可以为SOCK_DGRAM.最后一个参数是两个套接字描述符。
四、套接字函数
1)由bind创建的路径名默认访问权限应为0777,并按照当前umask值进行修改。
2)与UNIX域套接字关联的路径名应该是一个绝对路径名,而不是一个相对路径名,而不是一个相对路径名。
3)在connect调用中指定的路径名必须是一个当前绑定在某个打开的UNIX域套接字上的路径名,而且他们的套接字类型也必须一致。
4)调用connect链接一个UNIX域套接字设计的权限测试等同于调用open以只读方式访问相应的路径名。
5)UNIX域字节流套接字类似TCP套接字,他们都为进程提供一个无记录边界的字节流接口。
6)在一个未绑定的UNIX域套接字上发送数据报不会自动给这个套接字捆绑一个路径名,这一点不同于UDP套接字,在一个未绑定的UDP套接字上发送UDP数据报道指给这个套接字捆绑一个临时端口,这一点异味这除非数据报发送端已经捆绑一个路径名到它的套接字,否则数据报接收端无妨发回应答数据报。类似地,对于某个UNIX域套接字数据报套接字的connect调用不会给本套接字捆绑给一个路径名,这一点不同于TCP和UDP。
五、描述符传递
常见的从一个进程到另一个进程传递打开的描述符时,我们经常使用的方法:
1)Fork调用返回之后,子进程共享父进程的所有打开的描述符。
2)Exec调用执行以后,所有描述符通常保持打开状态不变。
第一个例子中,进程先发开一个描述符,再调用fork,然后父进程关闭这个描述符,子进程则才狐狸这个描述符。这样一个打开的描述符就从父进程传递给子进程。然而我们可能想让子进程打开一个描述符并把它传递给父进程。
当前的UNIX系统提供了用于从一个进程向任一其他进程传递任一打开的描述符的方法。也就是说,这两个进程灭于任何亲缘关系。这种技术要求首先在这两个进程之间创建一个UNIX域套接字,然后使用sendmsg跨这个套接字发送一个特殊消息,这个消息由内核来专门处理,会把打开的描述符从发送进程传递到接受进程。
这两个进程之间传递描述符涉及的步骤如下:
1) 创建一个字节流的或数据报的UNIX域套接字。
2) 发送进程通过调用返回描述符的任一UNIX函数打开一个描述符,这些函数的例子有open、pipe、mkfifo、socket和accept。可以在进程之间传递的描述符不限类型,这就是我们这种技术为“描述符传递”而不是“文件描述符传递”的原因。
3) 发送进程创建一个msghdr结构,其中含有待处理的描述符。
4) 接受进程调用recvmsg在来自步骤1的UNIX域套接字上接受这个描述符。
未完待续........