首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux c 本地套接字

Linux C 本地套接字基础概念

本地套接字(Unix Domain Sockets)是一种进程间通信(IPC)机制,允许同一台机器上的进程之间进行通信。与网络套接字不同,本地套接字不涉及网络协议栈,因此它们通常比网络套接字更快且更安全。

相关优势

  1. 高效性:由于不涉及网络协议栈,本地套接字的通信延迟更低。
  2. 安全性:本地套接字只能在同一台机器上的进程之间通信,减少了网络攻击的风险。
  3. 灵活性:支持流式(SOCK_STREAM)和数据报(SOCK_DGRAM)两种模式,分别类似于TCP和UDP。

类型

  • 流式套接字(SOCK_STREAM):提供可靠的、面向连接的通信,类似于TCP。
  • 数据报套接字(SOCK_DGRAM):提供无连接的、不可靠的通信,类似于UDP。

应用场景

  • 进程间通信:在同一台机器上的不同进程之间传递数据。
  • 守护进程与服务通信:例如,Web服务器与日志记录进程之间的通信。
  • 高性能服务器:在需要低延迟和高吞吐量的场景中使用。

示例代码

创建和使用流式本地套接字

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/my_socket"

int main() {
    int sockfd;
    struct sockaddr_un addr;
    char buffer[1024];

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

    // 绑定地址
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);

    unlink(SOCKET_PATH);
    if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
        perror("bind");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(sockfd, 5) == -1) {
        perror("listen");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    printf("Waiting for connection...\n");

    int connfd = accept(sockfd, NULL, NULL);
    if (connfd == -1) {
        perror("accept");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 接收数据
    ssize_t numbytes = recv(connfd, buffer, sizeof(buffer), 0);
    if (numbytes == -1) {
        perror("recv");
        close(connfd);
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    buffer[numbytes] = '\0';
    printf("Received message: %s\n", buffer);

    // 关闭连接
    close(connfd);
    close(sockfd);

    return 0;
}

创建和使用数据报本地套接字

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCKET_PATH "/tmp/my_udp_socket"

int main() {
    int sockfd;
    struct sockaddr_un addr;
    char buffer[1024];

    // 创建套接字
    if ((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 绑定地址
    memset(&addr, 0, sizeof(struct sockaddr_un));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCKET_PATH, sizeof(addr.sun_path) - 1);

    unlink(SOCKET_PATH);
    if (bind(sockfd, (struct sockaddr*)&addr, sizeof(struct sockaddr_un)) == -1) {
        perror("bind");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 接收数据
    ssize_t numbytes = recvfrom(sockfd, buffer, sizeof(buffer), 0, NULL, NULL);
    if (numbytes == -1) {
        perror("recvfrom");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    buffer[numbytes] = '\0';
    printf("Received message: %s\n", buffer);

    // 关闭套接字
    close(sockfd);

    return 0;
}

常见问题及解决方法

1. 地址已被占用

原因:尝试绑定到一个已经存在的套接字文件。

解决方法

代码语言:txt
复制
unlink(SOCKET_PATH);

在绑定之前删除已存在的套接字文件。

2. 权限问题

原因:当前用户没有权限创建或访问套接字文件。

解决方法: 确保运行程序的用户有足够的权限,或者更改套接字文件的权限。

3. 连接被拒绝

原因:监听套接字的进程没有运行或者没有正确绑定地址。

解决方法: 确保监听进程正在运行并且正确绑定了地址。

通过以上信息,你应该能够理解Linux C本地套接字的基础概念、优势、类型、应用场景以及常见问题的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

46分16秒

Linux内核《套接字接口类型及原理 》

46分27秒

Linux内核网络设备与套接字缓冲区

12分18秒

32 C语言关键字

19分53秒

104-尚硅谷-高校大学生C语言课程-static关键字修饰变量

13分7秒

047 尚硅谷-Linux云计算-网络服务-VSFTP-本地用户实验

10分19秒

045 尚硅谷-Linux云计算-网络服务-VSFTP-本地登录和虚拟用户登录

11分15秒

056 尚硅谷-Linux云计算-网络服务-SAMBA-本地用户登录验证演示

1分24秒

Windows和Linux平台的逆向,有很大区别吗?【C++/病毒/内核/逆向】

9分19秒

【玩转腾讯云】10分钟零基础部署本地JavaWeb项目到腾讯云轻量应用服务器

21.2K
1时36分

设计模式在框架构建以及框架核心流程中的应用

7分16秒

050_如何删除变量_del_delete_variable

371
1时36分

红黑树在linux中的3个经典用法,让你知其所以然

领券