• UDP通信


    UDP通信 

    1. #include
    2. #include
    3. ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
    4.            const struct sockaddr *dest_addr, socklen_t addrlen);
    5. - 参数:
    6.       - sockfd : 通信的fd
    7.       - buf : 要发送的数据
    8.       - len : 发送数据的长度
    9.       - flags : 0
    10.       - dest_addr : 通信的另外一端的地址信息
    11.       - addrlen : 地址的内存大小
    12.        
    13. ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
    14.             struct sockaddr *src_addr, socklen_t *addrlen);
    15. - 参数:
    16.       - sockfd : 通信的fd
    17.       - buf : 接收数据的数组
    18.       - len : 数组的大小
    19. - flags : 0
    20.       - src_addr : 用来保存另外一端的地址信息,不需要可以指定为NULL
    21.       - addrlen : 地址的内存大小

     广播

    子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广
    播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1。
    a.只能在局域网中使用。
    b.客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。

    1. // 设置广播属性的函数
    2. int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t
    3. optlen);
    4. - sockfd : 文件描述符
    5.   - level : SOL_SOCKET
    6.   - optname : SO_BROADCAST
    7.   - optval : int类型的值,为1表示允许广播
    8.   - optlen : optval的大小

    组播

    单播地址标识单个 IP 接口,广播地址标识某个子网的所有 IP 接口,多播地址标识一组 IP 接口
    单播和广播是寻址方案的两个极端(要么单个要么全部),多播则意在两者之间提供一种折中方
    案。多播数据报只应该由对它感兴趣的接口接收,也就是说由运行相应多播会话应用系统的主机上
    的接口接收。另外,广播一般局限于局域网内使用,而多播则既可以用于局域网,也可以跨广域网
    使用。
    a.组播既可以用于局域网,也可以用于广域网
    b.客户端需要加入多播组,才能接收到多播的数据

    设置组播

    1. int setsockopt(int sockfd, int level, int optname,const void *optval,
    2. socklen_t optlen);
    3. // 服务器设置多播的信息,外出接口
    4. - level : IPPROTO_IP
    5.   - optname : IP_MULTICAST_IF
    6.   - optval : struct in_addr
    7.   // 客户端加入到多播组:
    8.   - level : IPPROTO_IP
    9.   - optname : IP_ADD_MEMBERSHIP
    10.   - optval : struct ip_mreq
    11. struct ip_mreq
    12. {
    13.   /* IP multicast address of group. */
    14.   struct in_addr imr_multiaddr; // 组播的IP地址
    15.   /* Local IP address of interface. */
    16.   struct in_addr imr_interface; // 本地的IP地址
    17. };
    18. typedef uint32_t in_addr_t;
    19. struct in_addr
    20. {
    21.   in_addr_t s_addr;
    22. };

     本地套接字

    本地套接字的作用:本地的进程间通信
    有关系的进程间的通信
    没有关系的进程间的通信

    1. // 本地套接字通信的流程 - tcp
    2. // 服务器端
    3. 1. 创建监听的套接字
    4.   int lfd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);
    5. 2. 监听的套接字绑定本地的套接字文件 -> server端
    6. struct sockaddr_un addr;
    7.   // 绑定成功之后,指定的sun_path中的套接字文件会自动生成。
    8. bind(lfd, addr, len);
    9. 3. 监听
    10.   listen(lfd, 100);
    11. 4. 等待并接受连接请求
    12.   struct sockaddr_un cliaddr;
    13.   int cfd = accept(lfd, &cliaddr, len);
    14. 5. 通信
    15.   接收数据:read/recv
    16.   发送数据:write/send
    17. 6. 关闭连接
    18.   close();
    19. // 客户端的流程
    20. 1. 创建通信的套接字
    21.   int fd = socket(AF_UNIX/AF_LOCAL, SOCK_STREAM, 0);
    22. 2. 监听的套接字绑定本地的IP 端口
    23.   struct sockaddr_un addr;
    24.   // 绑定成功之后,指定的sun_path中的套接字文件会自动生成。
    25. bind(lfd, addr, len);
    26. 3. 连接服务器
    27.   struct sockaddr_un serveraddr;
    28.   connect(fd, &serveraddr, sizeof(serveraddr));
    29. 4. 通信
    30.   接收数据:read/recv
    31.   发送数据:write/send
    32. 5. 关闭连接
    33.   close();
    34. // 头文件: sys/un.h
    35. #define UNIX_PATH_MAX 108
    36. struct sockaddr_un {
    37. sa_family_t sun_family; // 地址族协议 af_local
    38. char sun_path[UNIX_PATH_MAX]; // 套接字文件的路径, 这是一个伪文件, 大小永远=0
    39. };


    本地套接字实现流程和网络套接字类似,一般呢采用TCP的通信流程。

  • 相关阅读:
    软考高级信息系统项目管理师系列论文十六:论信息系统项目质量管理
    SSL是什么?关于SSL和TLS的常见问题
    代码随想录学习记录——栈与队列篇
    Python系列模块之标准库json详解
    愚蠢的代码?某程序员强行编写了一段开发阶段无法调试的代码,大佬们快来救救他!
    【python】 int、float、double与16进制字符串的互相转换
    科技赋能,创新发展!英码科技受邀参加2023中国创新创业成果交易会
    设计芯片的EDA软件
    【ELFK】之消息队列kafka
    如何构建一个简单的前端框架
  • 原文地址:https://blog.csdn.net/ME_Liao_2022/article/details/133700387