• Linux网络编程(socket本机通信)


    Linux网络编程(socket本机通信)

    socket本机通信底层需要借助socket文件,进行同一计算机下的进程间通信,通过ls -l命令查看可以看到socket文件是以s开头的。

    一、需要用到的函数解析

    int socket(int domain, int type, int protocol);
    功能:创建socket对象
    domain:一般常用的有以下几个选项

    AF_UNIX/AF_LOCAL本地通信、进程间通信
    AF_INET基于IPv4地址通信
    AF_INET6基于IPv6地址通信

    type

    • SOCK_STREAM 数据流协议 本地
    • SOCK_DGRAM 数据包协议

    protocol:特殊通信协议,一般不用,写0即可
    返回值:成功返回socket描述符,失败返回-1

    int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    功能:绑定socket和通信地址
    sockfd:socket描述符
    addr:地址结构体指针
    实际传递的是 sockaddr_un或者sockaddr_in 结构体指针,需要把它们统一转换为sockaddr*类型,但是C语言没有自动类型识别转换,需要进行强制类型转换。

    // 本地通信地址结构类型
    #include 
    struct sockaddr_un {
        __kernel_sa_family_t sun_family; // 地址簇 domain写什么这就写什么
        char sun_path[UNIX_PATH_MAX];   // socket文件地址
    };
    
    //  网络地址结构体类型
    #include 
    struct sockaddr_in {
        __kernel_sa_family_t  sin_family; // 地址簇 domain写什么这就写什么
        __be16        sin_port;   // 端口号
        struct in_addr    sin_addr;   // IP地址
    };  
    struct in_addr {
    	__be32  s_addr;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    addrlen:地址结构体的字节数,用于区分 sockaddr_un还是sockaddr_in
    返回值:成功返回0 失败返回-1

    int listen(int sockfd, int backlog);
    功能:监听socket,数据流通信时使用
    sockfd:socket描述符
    backlog:等待连接socket的排队数量,默认最大128
    返回值:成功返回0,失败返回-1

    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
    功能:等待连接,数据流通信时使用
    sockfd:socket描述符
    addr:获取连接者的地址
    addrlen:既是输入,也是输出,既告诉accept函数当前计算机地址结构体的字节数,同时也能获取发送者的地址结构体字节数。
    返回值:连接成功返回一个连接后的socket描述符

    注意:如果没有连接,则阻塞

    int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
    功能:连接socket
    sockfd:socket描述符
    addr:连接目标的地址结构体指针
    addrlen:地址结构体的字节数,用于区分 sockaddr_un还是sockaddr_in
    功能:成功返回0,失败返回-1

    二、本机通信编程模型

    本地通信编程模型(数据流)

    进程A                         进程B
    创建socket                    创建socket
    准备通信地址(本地socket地址)  准备对方通信地址
    绑定socket和地址                  ...
    开启监听                          ...
    等待连接                          连接
    接收/发送数据                 发送/接收数据
    关闭socket                   关闭socket
    删除socket                     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    C#使用 MQTTnet 快速实现 MQTT 通信
    SpringMVC 学习(六)乱码问题
    Caddy Web服务器深度解析与对比:Caddy vs. Nginx vs. Apache
    Opencv基本操作 (上)
    Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
    java 实现发送邮箱,复制即用,包含邮箱设置第三方登录授权码获取方法
    1.33 定时器总结篇
    SonarQube:质量阀值配置
    WPF MVVM实现TreeView层级显示
    二项队列----数据结构与算法分析6.8
  • 原文地址:https://blog.csdn.net/m0_50711528/article/details/126770228