一、sockaddr_un简介
Socket是一个在计算机网络中能够实现进程间通信的一种机制。它通过网络将进程之间的数据进行交换,从而实现一些必要的功能。而sockaddr_un则是Socket地址结构之一,它用于Unix域协议。
Unix域协议又称为IPC(InterProcess Communication),可以通过UNIX文件系统维护一个虚拟的数据传输域,进程在域内以Socket方式进行通信,无需通过计算机网络。
sockaddr_un是一个结构体,既包含了类型(sun_family),又包括了路径名称(sun_path)。其中sun_family的值通常设置为AF_UNIX。
struct sockaddr_un { sa_family_t sun_family; // AF_UNIX char sun_path[108]; };
二、sockaddr_un的使用场景
因为sockaddr_un是一种在本机之间进行通信的协议,所以它适用于很多本机通信的场景。比如下面这些场景:
1. 本机内进程通信
在同一台计算机上,不同的进程如果需要进行通信,就可以通过Sockaddr_un来实现通信。
2. web服务器
可以使用Socket作为客户端和服务器之间的通信方式,这种方式通常用于实现Web服务器的页面渲染,并对客户端的请求进行响应。
3. 进程监控
当一个服务已经存在时,我们希望能够对该服务进行监控和管理。Sockaddr_un可以实现让该服务监听某个特定的端口,从而更好地实现进程监控。
三、sockaddr_un的使用案例
1. 创建Unix域套接字
#include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <unistd.h> #include <sys/un.h> int main() { int sockfd; struct sockaddr_un addr; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket error"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, "/tmp/my_socket", sizeof(addr.sun_path) - 1); if (bind(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { perror("bind error"); exit(EXIT_FAILURE); } return 0; }
上述代码首先调用socket创建一个套接字,sockaddr_un有两个域:sun_family和sun_path,sun_family表示所使用的协议族,sun_path指向码路径名。在这个例子中,也是我们最常见的本地套接字。
然后使用bind将套接字绑定到指定的路径名,此处指定的路径名为/tmp/my_socket。
2. 进行Unix域套接字通信
接下来,我们可以用create_socket()函数创建一个Socket连接,来模拟进程之间的通信。在这个例子中,我们向套接字中写入一些数据,然后从套接字中读取出来:
#include <sys/types.h> #include <sys/socket.h> #include <stdlib.h> #include <unistd.h> #include <sys/un.h> #include <stdio.h> #include <string.h> #define MAX_BUFFER_SIZE 512 int create_socket() { int sockfd; struct sockaddr_un addr; sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket error"); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, "/tmp/my_socket", sizeof(addr.sun_path) - 1); if (connect(sockfd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { perror("connect error"); exit(EXIT_FAILURE); } return sockfd; } int main() { int sockfd; char buf[MAX_BUFFER_SIZE]; memset(buf, 0, sizeof(buf)); sockfd = create_socket(); //写入数据 const char* msg = "Hello, Unix Domain Socket"; if (write(sockfd, msg, strlen(msg)) == -1) { perror("write error"); exit(EXIT_FAILURE); } //读取数据 int n = read(sockfd, buf, MAX_BUFFER_SIZE); if (n == -1) { perror("read error"); exit(EXIT_FAILURE); } else { printf("received msg: %s\n", buf); } close(sockfd); return 0; }
在上述代码中,我们通过create_socket()函数创建了一个Socket连接。然后往它里面写入了一些数据,最后从Socket连接中读取出数据。如果读取到数据,就输出该数据。
原创文章,作者:XFZPP,如若转载,请注明出处:https://www.506064.com/n/332937.html