• 网络编程day02


    网络编程

        底层遵循TCP\IP协议,再系统层上以Socket接口方式呈现

        基于TCP协议的网络通信模型:

             服务器                          客户端          

         创建socket对象                  创建socket对象

    准备通信地址(端口号+ip地址)            准备通信地址(服务器的公网ip)

       绑定socket与通信地址                    ...

        设置监听和排队数量                     ...

          等待客户端连接                    连接服务器

      分配新的socket对象+开

      辟新的进程或者线程服务                    ...

            接收请求                         发送请求

            响应请求                         接收相应

           关闭socket                      关闭socket

        使用到的函数:

        int socket(int domain, int type, int protocol);

        功能: 创建socket对象

        domain:

            AF_INET             基于IPv4地址通信

        type:

            SOCK_STREAM         基于数据流协议  TCP

        protocol:

            特殊通信协议,一般不用,也0或者NULL即可

        返回值: 成功返回socket描述符,失败返回-1

        //  网络地址结构体类型

        #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;

            };

        大小端数据转换函数:

            #include

            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字节的网络字节序转换成本地字节序

        ip地址转换的函数:

            in_addr_t inet_addr(const char *cp);

                功能: 把字符串格式的点分十进制的ip地址转换成整数形式的ip地址(小端->大端)

            char *inet_ntoa(struct in_addr in);

                功能: 把整数形式的ip地址转换成字符串格式的点分十进制表示的ip地址

        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: 既是输入,也是输出

            1、既告诉accept函数当前计算机地址结构体的字节数

            2、同时也能获取客户端的地址结构体字节数

        返回值: 连接成功返回一个新的连接后的socket描述符,连接失败返回-1

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

        int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

        功能: 连接服务器

        sockfd: 自己的socket描述符

        addr: 连接服务器的地址结构体指针

        addrlen: 地址结构体的字节数,用于区分 sockaddr_un还是sockaddr_in

        返回值: 成功返回0 失败-1

        注意: TCP收发数据可以继续使用read、write

        ssize_t send(int sockfd, const void *buf, size_t len, int flags);

        功能: TCP协议通信时专用的数据发送函数

        sockfd: 连接成功的socket描述符

        buf: 待发送数据的首地址

        len: 要发送的字节数

        flags:

            0   阻塞发送

            1   不阻塞发送

        返回值:成功发送的字节数

            -1  出现错误

            0   连接断开

        ssize_t recv(int sockfd, void *buf, size_t len, int flags);

        功能: TCP协议通信时专用的接收数据函数

        sockfd: 连接成功的socket描述符

        buf: 存储数据缓冲区内存首地址

        len: 缓冲区的大小

        flags:

            0   阻塞接收

            1   不阻塞接收

        返回值:成功发送的字节数

            -1  出现错误

            0   连接断开

        服务器公网ip: 47.97.229.46(不会变化)

        服务器本机ip: 172.16.83.85(可能变化,ifconfig查询)

        用户名 student

        密码 zzxx




     

        基于UDP通信协议的网络通信编程模型

            接收端                                发送端

          创建socket                            创建socket

          准备通信地址                           准备通信地址

             绑定                                  ...

           接收请求                               发送请求

           响应请求                               接收响应

          关闭socket                             关闭socket

        UDP使用到的函数:

        int socket(int domain, int type, int protocol);

        功能: 创建socket对象

        domain:

            AF_INET             基于IPv4地址通信

        type:

            SOCK_DGRAM         基于数据流协议  UDP

        protocol:

            特殊通信协议,一般不用,也0或者NULL即可

        返回值: 成功返回socket描述符,失败返回-1

        UDP专属的数据发送接收函数! ! !

        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: 地址结构体的字节数

        返回值:成功发送的字节数

            0    通信关闭

            -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: 缓冲区的字节数

        flags: 是否阻塞   一般写0 阻塞即可

        src_addr: 用于存储发送者的地址

        addrlen: 既是输入,也是输出

            1、既告诉函数当前src_addr结构体的字节数

            2、同时也能实际接收到发送者的地址结构体字节数

        返回值:成功接收到字节数

            0    通信关闭

            -1   出现错误

  • 相关阅读:
    Unity - OnTriggerEnter2D OnCollisionEnter2D
    kubernetes集群之调度系统
    Spring+SpringMVC+Mybatis(开发必备技能)01、基础idea环境配置
    Java习题:第三章 面向对象
    机器学习复习(待更新)
    【CV】第 9 章:图像分割
    如何理解单例模式?
    国庆创作周 组播《第十二课》
    redis安装、redis 普通用户启动
    Synopsys新思科技2023“向新力”秋季校园招聘内推
  • 原文地址:https://blog.csdn.net/weixin_61180910/article/details/126750194