Unix域套接字—基于文件的Socket通信

Unix域套接字—基于文件的Socket通信。小编来告诉你更多相关信息。Unix域套接字—基于文件的Socket通信今天小编详解Unix域套接字—基于文件的Socket通信的IT小经验,接下来小编就来介绍。...

Unix域套接字—基于文件的Socket通信。小编来告诉你更多相关信息。

Unix域套接字—基于文件的Socket通信

今天小编详解Unix域套接字—基于文件的Socket通信的IT小经验,接下来小编就来介绍。

一.概述

在Linux中,.sock 文件通常是Unix域套接字(Unix Domain Socket)的一部分。

Unix域套接字是一种用于进程间通信的特殊类型的套接字,它不依赖于网络协议,而是使用文件系统作为通信的载体

Unix域套接字的特点:

  • 通信基于文件系统Unix域套接字通过在文件系统中创建一个特殊类型的文件(.sock 文件)来实现进程间通信。这个文件既可以在本地文件系统上,也可以在共享文件系统上。
  • 高性能:与基于网络的套接字相比,Unix域套接字通常具有更低的延迟和更高的吞吐量,因为它们不需要经过网络协议栈
  • 进程间通信:进程可以通过Unix域套接字相互发送消息,进行数据传输,实现进程间通信。

二.Unix套接字建立流程

Unix域套接字—基于文件的Socket通信-图1

整体流程图

Unix域套接字的创建通常涉及以下步骤:

  1. 创建套接字:使用socket()系统调用创建一个Unix域套接字。
int socket(int domain, int type, int protocol);
  1. 绑定地址:使用bind()系统调用将套接字与一个文件路径绑定,创建一个.sock文件。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);`
  1. 监听连接(可选):如果需要,可以使用listen()系统调用监听连接。
int listen(int sockfd, int backlog);
  1. 接受连接(可选):使用accept()系统调用接受客户端的连接请求。
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  1. 进行通信:使用send()recv()等系统调用进行进程间通信。
ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  1. 关闭套接字:使用close()关闭Unix域套接字。
int close(int sockfd);

7.销毁文件

 // 删除创建的文件    unlink(SOCKET_PATH);

三.综合示例

server.c文件

#include #include #include #include #include #define SOCKET_PATH \"example.sock\"#define BUFFER_SIZE 1024int main() {    int server_socket, client_socket;    struct sockaddr_un server_address, client_address;    socklen_t client_address_len = sizeof(client_address);    char buffer[BUFFER_SIZE];    // 创建套接字    server_socket = socket(AF_UNIX, SOCK_STREAM, 0);    if (server_socket == -1) {        perror(\"Socket creation failed\");        exit(EXIT_FAILURE);    }    // 设置服务器地址结构    memset(&server_address, 0, sizeof(server_address));    server_address.sun_family = AF_UNIX;    strncpy(server_address.sun_path, SOCKET_PATH, sizeof(server_address.sun_path) - 1);    // 绑定地址    if (bind(server_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {        perror(\"Bind failed\");        exit(EXIT_FAILURE);    }    // 监听连接    if (listen(server_socket, 5) == -1) {        perror(\"Listen failed\");        exit(EXIT_FAILURE);    }    printf(\"等待客户端连接...\\n\");    // 接受连接    client_socket = accept(server_socket, (struct sockaddr*)&client_address, &client_address_len);    if (client_socket == -1) {        perror(\"Accept failed\");        exit(EXIT_FAILURE);    }    printf(\"客户端已连接\\n\");    // 接收数据    ssize_t bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);    if (bytes_received == -1) {        perror(\"Receive failed\");        exit(EXIT_FAILURE);    }    buffer[bytes_received] = \'\\0\'; // 添加字符串结束符    printf(\"接收到的数据: %s\\n\", buffer);    // 发送响应    const char* response = \"收到消息\";    if (send(client_socket, response, strlen(response), 0) == -1) {        perror(\"Send failed\");        exit(EXIT_FAILURE);    }    // 关闭套接字    close(client_socket);    close(server_socket);    // 删除创建的文件    unlink(SOCKET_PATH);    return 0;}

Unix域套接字—基于文件的Socket通信。小编来告诉你更多相关信息。

Unix域套接字—基于文件的Socket通信

client.c文件:

#include #include #include #include #include #define SOCKET_PATH \"example.sock\"#define BUFFER_SIZE 1024int main() {    int client_socket;    struct sockaddr_un server_address;    char buffer[BUFFER_SIZE];    ssize_t bytes_received;    // 创建套接字    client_socket = socket(AF_UNIX, SOCK_STREAM, 0);    if (client_socket == -1) {        perror(\"Socket creation failed\");        exit(EXIT_FAILURE);    }    // 设置服务器地址结构    memset(&server_address, 0, sizeof(server_address));    server_address.sun_family = AF_UNIX;    strncpy(server_address.sun_path, SOCKET_PATH, sizeof(server_address.sun_path) - 1);    // 连接服务器    if (connect(client_socket, (struct sockaddr*)&server_address, sizeof(server_address)) == -1) {        perror(\"Connection failed\");        exit(EXIT_FAILURE);    }    // 发送数据    const char* message = \"Hello, Server!\";    if (send(client_socket, message, strlen(message), 0) == -1) {        perror(\"Send failed\");        exit(EXIT_FAILURE);    }    printf(\"发送消息: %s\\n\", message);    // 接收响应    bytes_received = recv(client_socket, buffer, sizeof(buffer), 0);    if (bytes_received == -1) {        perror(\"Receive failed\");        exit(EXIT_FAILURE);    }    buffer[bytes_received] = \'\\0\'; // 添加字符串结束符    printf(\"服务器响应: %s\\n\", buffer);    // 关闭套接字    close(client_socket);    return 0;}

效果展示:

Unix域套接字—基于文件的Socket通信-图2

client/server

大家可以根据实际的需求,对这个Demo进行修改,通过这个例子我们可以基本认识到通过文件建立Unix域套接字的通信过程。

以上就是带来的Unix域套接字—基于文件的Socket通信的具体介绍,供网友们借鉴参考。

阅读前请先查看【免责声明】本文内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅供展示。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 1217266901@qq.com 举报,一经查实,本站将立刻删除。 转载请注明出处:https://www.jingfakeji.com/tech/56710.html

上一篇 2024年02月05日 15:35
下一篇 2024年02月05日 15:35

相关推荐

  • 如何利用john破解Linux密码

    如何利用john破解Linux密码。小编来告诉你更多相关信息。如何利用john破解Linux密码今日IT小知识分享:如何利用john破解Linux密码的相关话题,具体详情如下:在Linux系统中,...

    2024年02月06日
    6
  • readv和writev函数详解

    readv和writev函数详解。小编来告诉你更多相关信息。readv和writev函数详解正文核心介绍:readv和writev函数详解的相关话题,具体详情如下:在实际开发种,高性能服务有一条...

    2024年02月05日
    8
  • 使用tftp协议传输镜像文件到开发板上

    使用tftp协议传输镜像文件到开发板上。小编来告诉你更多相关信息。使用tftp协议传输镜像文件到开发板上如果想知道使用tftp协议传输镜像文件到开发板上的内容,接下来就是全面介绍。一、整体流程tftp...

    2024年02月05日
    6
  • 如何解决Docker中Mysql连接很慢

    如何解决Docker中Mysql连接很慢。小编来告诉你更多相关信息。如何解决Docker中Mysql连接很慢跟大家分享如何解决Docker中Mysql连接很慢的电脑小知识,继续往下看吧!自己用docke...

    2024年02月05日
    9
  • Linux防火墙之-iptables详解

    Linux防火墙之-iptables详解。小编来告诉你更多相关信息。Linux防火墙之-iptables详解网为你介绍Linux防火墙之-iptables详解的教程内容,接下来就是全面介绍。项目介绍ip...

    2024年02月05日
    6
  • Linux网络Phy驱动工作原理详解

    Linux网络Phy驱动工作原理详解。小编来告诉你更多相关信息。Linux网络Phy驱动工作原理详解今天小编详解Linux网络Phy驱动工作原理详解的电脑方面的小经验,下面为详细的介绍。Linux操...

    2024年02月05日
    7

联系我们

在线咨询: QQ交谈

邮箱:1217266901@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信