UNIX网络编程笔记(11)—UNIX域套接字
1.简介
Unix域协议并不是一个实际的协议族,而是在单个主机上执行客户/服务器通讯的一种方式,单个主机上执行通信,也就是所谓的进行间通信(IPC),所以Unix域套接字协议可以视作IPC方法之一。
Unix域提供两类套接字:字节流套接字(类似TCP)和数据报套接字(类似DUP)。
Unix域中用于标识客户和服务器的协议地址是普通文件系统中的路径名(但需要和Unix域套接字关联起来),否则无法读写这些文件。回忆一蛤,IPv4的协议地址由一个32位地址和16位端口号构成,IPv6协议地址则由一个128位地址和16位端口号组成。
2.Unix域套接字地址结构
#include <sys/un.h>
struct sockaddr_un {
sa_family_t sum_family;// AF_LOCAL或者AF_UNIX
char sun_path[104];//字符串指代路径(null终止)
};
sun_path
表示与套接字关联的地址,以NULL结尾,如果未指定地址通则通过以空字符串作为路径名指示,也就是说sun_path[0]
值为0,这个效果就好像Ipv4的INADDR_ANY
和IPv6的ADDR_ANY_INIT
。
3.socketpair函数
这个是UNIX域套接字特有的函数,它创建两个素侯连接起来的套接字。
#include <sys/socket.h>
int socketpair(int family , int type , int protocol ,int sockfd[2]);
//返回:成功则为0,出错则为-1
3.1参数说明
family: 为
AF_LOCAL
或者AF_UNIX
。
type:既可以是SOCK_STREAM
也可以是SOCK_DGRAM
。
protocol:必须为0。
sockfd[2]:新创建的两个套接字别在sockfd[0]和sockfd[1]中返回。
当设置type参数为SOCK_STREAM
时,得到的结果就叫做流管道这与pipe
创建的的普通UNIX管道类似了。差别在于流管道是全双工的,也就是说,两个描述符既可读也可写。回忆一蛤,用pipe
创建的匿名管道,pipefd[0]
用于读操作,pipefd[1]
用于写操作。
4.UNIX域套接字编程
还是根据UNP1中的代码写的,主要工作就是把包裹函数拆开。
4.1 Unix域字节流客户/服务器程序
跟TCP客户服务程序类似,不过在bind
步骤中,是将特定的path
与套接字绑定。
代码
服务器程序
//unixdomainserv.c
#include <sys/un.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <stdio.h>
#include <netinet/in.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#define UNIXDOMAIN_PATH "/tmp/unix.str"
#define MAXLEN 1024
void sig_child(int);
void str_echo(int );
typedef void(*sig_handle)(int);//handle
int main(int argc ,char **argv)
{
int listenfd;
int connfd;
socklen_t clilen;
struct sockaddr_un cliaddr,servaddr;
pid_t childpid;
if((listenfd = socket(AF_LOCAL,SOCK_STREAM,