sockaddr_un详解

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
XFZPPXFZPP
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论