day01

一、进程间通信-socket套接字
    基本特征:socket是一种接口技术,被抽象成一种文件的操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程进行通信(网络通信)
   
    本地进程间通信编程模型:
                进程A                     进程B
             创建socket对象            创建socket对象
      准备通信地址(本地socket文件)       准备通信地址
            绑定socket和地址                ···
                监听                       ···
               等待连接                    连接
             接收、发送数据             发送、接收数据
             关闭socket                 关闭socket
             删除socket

        注意:底层需要借助socket文件,才能进行同一计算机中不同进程的通信

        int socket(int domain,int type,int protocol)
        功能:创建socket对象
            domain:
                AF_UNIX/AF_LOCAL    本地通信,进程间通信
                AF_INET             基于IPv4地址通信
                AF_INET6            基于IPv6地址通信
            type:
                SOCK_STREAM         数据流协议(本地) tcp
                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 <sys/un.h>
                struct sockaddr_un{
                    __kernel_sa_family_t sun_family;    //domain写啥它写啥
                    char sun_path[UNIX_PATH_MAX];       //socket文件路径
                };
                    网络通信使用
                #include <netinet/in.h>
                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; //IP地址数据
                    }
            addrlen:地址结构体的字节数,用于区分是sockaddr_un还是sockaddr_in
        返回值:成功0,失败-1

        int listen(int sockfd, int backlog);
        功能:监听已经绑定好的socket
            sockfd:socket描述符  
            backlog:监听的等待连接的排队数量   默认最大128
        返回值:成功0,失败-1

        int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
        功能:等待连接
            sockfd:socket描述符
            addr:获取连接者的通信地址,不想获取可以给NULL
            addrlen:获取连接者的通信地址结构体字节数
        返回值:成功返回一个针对该连接的新的socket描述符,失败-1
        注意:如果没有连接,该函数会阻塞等待
             如果要获取连接者的地址,后两个参数都需要传递
             addrlen要获取时,先要输入addr的字节数,才能获取连接者的IP

        int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
        功能:连接socket
            sockfd:socket描述符
            addr:目标地址
            addrlen:目标地址结构体的字节数
        返回值:成功0,失败-1

        ssize_t send(int sockfd, const void *buf, size_t len, int flags);
        功能:向建立连接后的socket发送数据,数据流通信使用
            sockfd:建立连接后的socket描述符
            buf:待发送的数据内存首地址
            len:要发送的字节数
            flags:一般写0即可(阻塞发送)
                MSG_DONTWAIT 不阻塞
        返回值:成功返回成功发送的字节数、失败-1

        ssize_t recv(int sockfd, void *buf, size_t len, int flags);
        公共:从建立连接的socket中接收数据,数据流通信使用
            sockfd:建立连接之后的socket描述符
            buf:存储接收的数据的内存首地址
            len:buf的字节数
            flags:一般写0即可(阻塞发送)
                MSG_DONTWAIT 不阻塞
        返回值:成功返回成功接收的字节数、-1出现错误、正常断开返回0

        close(fd)
        功能:关闭socket

二、基于TCP协议的网络通信
    TCP网络通信编程模型:
                计算机S                   计算机C
             创建socket对象            创建socket对象
           准备通信地址(自己的IP)       准备通信地址(计算机S的IP,与C在同一个局域网,或者S是公网IP)
            绑定socket和地址                ···
                监听                       ···
               等待连接                    连接
             接收、发送数据             发送、接收数据
             关闭socket                 关闭socket
             
    本地字节序与网络字节序转换(大小端转换)
        #include <arpa/inet.h>
        uint32_t htonl(uint32_t hostlong);
        功能:把4字节的本地字节序转换成网络字节序
        uint16_t htons(uint16_t hostshort);
        功能:把2字节的本地字节序转换成网络字节序
        uint32_t ntohl(uint32_t netlong);
        功能:把4字节的网络字节序转换成本地字节序
        uint16_t ntohs(uint16_t netshort);
        功能:把2字节的网络字节序转换成本地字节序
                    网络通信使用
                #include <netinet/in.h>
                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; //IP地址数据(大端整数)
                    }
            点分十进制字符串的IP地址转换成小端整数、然后需要转大端

            IP地址与整数的转换
            in_addr_t inet_addr(const char *cp);
            功能:把字符串形式的点分十进制的IP地址转换成大端的整数形式的IP地址
            char *inet_ntoa(struct in_addr in);
            功能:把大端的IP整数转换成以字符串形式的点分十进制的IP地址

三、UDP网络通信
    UDP网络通信编程模型:
        计算机S                 计算机C
       创建socket              创建socket
      准备通信地址(自己的)     准备通信地址(计算机S)
      绑定socket和通信地址      ·······
        接收、发送数据          发送、接收数据
        关闭socket              关闭socket

   
    ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);
        功能:UDP专用的数据发送
            sockfd:socket描述符
            buf:待发送的数据内存首地址
            len:要发送的字节数
            flags:一般写0即可(阻塞发送)
            dest_addr:发送目标的地址结构体
            addrlen:地址结构体的字节数
        返回值:成功返回成功发送的字节数、错误-1

    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);
        功能:UDP专用的数据接收
            sockfd:socket描述符
            buf:待发送的数据内存首地址
            len:buf的大小
            flags:一般写0即可(阻塞发送)
            src_addr:获取发送者的地址
            addrlen:先要输入才能输出发送者的地址
        返回值:成功接收到的字节数、错误-1、关闭通信0
posted @   歪爱慕外  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示