网络编程day2——基于TCP/IP协议的网络通信

TCP网络通信编程模型:

        计算机S                                                 计算机C

     创建socket对象                                   创建socket对象

     准备通信地址(自己的ip(非公网ip))      准备通信地址

                                    (计算机S的,与C在同一个局域网,或者S是公网ip)

      绑定sokect对象和地址                          ...

       监听                                                      ...

      等待连接                                              连接

      接收\发送数据                                     发送\接收数据

      关闭socket                                          关闭socket

    本地字节序(小端)与网络字节序(大端)的转换:

    #include <arpa/inet.h>

    uint32_t htonl(uint32_t hostlong);

    功能:把4字节的本地字节序转化成网络字节序

    uint16_t htons(uint16_t hostshort);    //本地是小端  网路通信是大端

    功能:把2字节的本地字节序转化成网络字节序 //h:home 本地  to  n:net  网络   s:short 端口号是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; //

    __be16        sin_port;   // 端口号 需要大端数据

    struct in_addr    sin_addr;   // IP地址结构体

    };

    struct in_addr {

        __be32  s_addr;     //  IP地址数据 大端整数

    };

    点分十进制字符串的ip地址转换成小端整数、然后还需要转大端:

    "192.168.0.1"  (192<24)|(168<16)|(0<8)|(1)

    11000000 00000000 00000000 00000000     (192<24)

                     10101000 00000000 00000000     (168<16)

                                      00000000 00000000     (0<8)

                                                                      1     (1)

     11000000 10101000 00000000 00000001

    ip地址与整数的转换:

    in_addr_t inet_addr(const char *cp);

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

    char *inet_ntoa(struct in_addr in);

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

UDP网络通信编程模型:

        计算机S                                  计算机C

     创建socket                              创建socket

     准备通信地址(自己的)             准备通信地址(S的地址)

     绑定socket和通信地址              ...

     接收\发送数据                          发送\接收数据  

     关闭socket                              关闭socket

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

    返回值:成功发送的字节数,-1出现错误


 UDP数据接收函数

  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表示关闭通信

两者的区别:

1、TCP是面向连接的,UDP是面向无连接的;

2、UDP程序结构较简单;

3、TCP是面向字节流的,UDP是基于数据报的;

4、TCP保证数据正确性,UDP可能丢包;

5、TCP保证数据顺序,UDP不保证。  文章来源地址https://uudwc.com/A/dPYX1

原文地址:https://blog.csdn.net/weixin_51479108/article/details/132590229

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年08月31日 11:09
LeetCode-53-最大子数组和-贪心算法
下一篇 2023年08月31日 11:13