📜  Unix套接字-摘要(1)

📅  最后修改于: 2023-12-03 14:48:13.680000             🧑  作者: Mango

Unix套接字-摘要

Unix套接字(Unix Domain Socket)是一种流类型(SOCK_STREAM)或数据报类型(SOCK_DGRAM)的网络socket,它只能用于本地进程之间的通信,不能通过网络通信。Unix套接字通信速度快、效率高,适用于一些本地进程之间需要高效通信的场景。

优点与应用场景
  1. Unix套接字只能用于本地进程之间的通信,因此通信速度快、效率高。
  2. Unix套接字能够同时支持流类型(SOCK_STREAM)和数据报类型(SOCK_DGRAM),适用于不同的应用场景。
  3. Unix套接字可以在同一台机器上的不同进程之间进行通信,因此适用于多进程编程场景。

Unix套接字适用于多种场景,例如:

  1. 多进程协同作业。不同进程可以通过Unix套接字进行通信,完成协同作业。
  2. 进程间同步。多个进程可以通过Unix套接字进行通信,实现同步操作。
  3. 大型应用程序中的模块间通信。不同的模块使用Unix套接字进行通信,使应用程序的结构更加清晰。
  4. 守护进程。守护进程可以通过Unix套接字与其他进程通信,完成一些后台操作。
使用方法

Unix套接字的使用和一般socket编程类似,可以使用C语言的系统调用函数进行编程。在Linux中,相关系统调用函数包括:

  1. socket():创建Unix套接字。
  2. bind():将Unix套接字绑定到一个本地地址上。
  3. listen():指示socket开始监听连接请求。
  4. accept():等待并接受客户端连接请求。
  5. connect():向Unix套接字发起连接请求。
  6. send():向Unix套接字发送数据。
  7. recv():从Unix套接字接收数据。

下面展示创建Unix套接字的C语言代码片段:

#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    int sockfd;
    sockaddr_un addr;

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0); // 创建Unix套接字
    if (sockfd == -1)
    {
        perror("socket");
        return 1;
    }

    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, "/tmp/mysocket", sizeof(addr.sun_path)-1);

    if (bind(sockfd, (sockaddr*)&addr, sizeof(addr)) == -1) // 绑定Unix套接字到本地地址上
    {
        perror("bind");
        return 1;
    }

    if (listen(sockfd, 5) == -1)  // 开始监听连接请求
    {
        perror("listen");
        return 1;
    }

    return 0;
}
总结

Unix套接字是一种高效的本地进程通信机制。它适用于多进程编程场景,能够提高进程之间的协同作业效率。在Linux系统中,Unix套接字相关的系统调用函数提供了强大的支持,方便程序员进行编程。