域套接字

一、域套接字

(1) 只能用于同一设备上不同进程之间的通信;

(2) 效率高于网络套接字。域套接字仅仅是复制数据,并不走协议栈;

(3) 可靠,全双工;

二、相关接口

使用套接字除了可以实现网络间不同主机间的通信外,还可以实现同一主机的不同进程间的通信,且建立的通信是双向的通信。即域套接字,将通信域指定为PF_UNIX.

int socket(int domain, int type, int protocol);

domain用于指定通信域,取PF_UNIX/AF_UNIXAF_UNIX时,表示创建UNIX域的套接字,可实现同一机器上的不同进程间的通信。
PF_INET和AF_INET表示网络套接字。PF_PACKET用来与驱动层面收发数据报的,接收和发送报文包含链路层信息,type 可为:SOCK_RAW或SOCK_DGRAM。

int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

调用bind函数实现了套接字与地址(这里是文件名)的绑定。参数my_addr为指向结构体sockaddr_un的指针。
当我们将一个地址绑定至域套接字,系统用该路径名创建一个类型为S_IFSOCK的文件,尽告诉客户端名字,不能打开,也不能通信,不会自动删除,需要程序完成后删除,若文件已存在则bind失败;
unlink(path),确保之前的path文件不存在,bind会创建该文件。

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

Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。

int listen(int sockfd, int backlog);

将套接字文件描述符从主动转为被动文件描述符,然后用于被动监听客户端的连接。sockfd表示socket创建的套接字文件描述符,backlog指定同时能处理的最大连接要求, 如果连接数目达此上限则client 端将收到ECONNREFUSED 的错误。
附加说明:listen()只适用SOCK_STREAM 或SOCK_SEQPACKET 的socket 类型. 如果socket 为AF_INET 则参数backlog 最大值可设至128.

三、域套接字实例

 

 

Linux-进程间通信(四): 域套接字 - AlexAlex - 博客园 (cnblogs.com)

四、AF和PF的区别

AF 表示ADDRESS FAMILY 地址族 
PF 表示PROTOCL FAMILY 协议族
在windows中AF_INET与PF_INET完全一样。而在Unix/Linux系统中,在不同的版本中这两者有微小差别,对于BSD,是AF,对于POSIX是PF,基本可以混用。

五、sockaddr数据结构
strcut sockaddr 很多网络编程函数诞生早于IPv4协议,那时候都使用的是sockaddr结构体,为了向前兼容,现在sockaddr退化成了(void *)的作用,传递一个地址给函数,至于这个函数是sockaddr_in还是sockaddr_in6,由地址族确定,然后函数内部再强制类型转化为所需的地址类型。

 

 网络套接字编程(socket 详解)_blog_zhangxu的博客-CSDN博客_网络套接字socket

 

posted @ 2022-06-28 15:45  Lin_泠沐  阅读(998)  评论(0编辑  收藏  举报