• udp多播


    Linux C编程 socket——Udp组播(多播)_嵌入式-沉默的博客-CSDN博客

    http://blog.chinaunix.net/uid-28458801-id-5085099.html

    1.基本概念:

    首先需要明白:单播,组播,广播

    单播:点对点的通信

    组播:一对多(这个多可以为1,就是单播,可以为N,就是广播)

    广播:一对所有

    2. 简单的例子

    • 我们把发送组播的设备叫做组播源,接受组播的设备叫做组播接收者。
    • 239.0.0.1-239.255.255.255是本地有效的组播地址,即类似于私网IP地址。当在企业内部部署组播时,可以配置上述IP地址。
       

    组播源:往多播地址和端口上发送消息,发送消息。

    • IP_MULTICAST_IF:用于设置组播的默认默认网络接口,会从给定的网络接口发送,另一个网络接口会忽略此数据

    (1)建立一个socket。

    (2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。

    (3)加入多播组。

    (4)发送和接收数据。

    (5)从多播组离开。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. int fd = socket(PF_INET, SOCK_DGRAM, 0);
    9. // 2.设置多播地址和端口
    10. struct in_addr imr_multiaddr;
    11. inet_pton(AF_INET, "239.0.0.9", &imr_multiaddr.s_addr);
    12. setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &imr_multiaddr, sizeof(imr_multiaddr));
    13. //3.初始化客户端的地址信息
    14. struct sockaddr_in caddr;
    15. caddr.sin_family = AF_INET;
    16. caddr.sin_port = htons(9999);
    17. inet_pton(AF_INET,"239.0.0.10",&caddr.sin_addr.s_addr);
    18. // 4.通信
    19. int num = 0;
    20. while (1)
    21. {
    22. char sendbuf[128];
    23. sprintf(sendbuf, "hello,client.....%d\n", num++);
    24. //发送数据
    25. sendto(fd, sendbuf, strlen(sendbuf) + 1,0,(struct sockaddr*)&caddr,sizeof(caddr));
    26. printf("组播的数据:%s\n", sendbuf);
    27. sleep(1);
    28. }
    29. close(fd);
    30. return 0;
    31. }
    • 组播接收者:加入组播组(指定组播地址和端口),接收消息。

    bind----指定接收的端口和ip地址----指定网卡

    setopt的IP_ADD_MEMBERSHIP-----加入组播组-----设置了组播地址

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. int main()
    7. {
    8. // 1.创建一个通信的socket
    9. int fd = socket(PF_INET, SOCK_DGRAM, 0);
    10. if (fd == -1)
    11. {
    12. perror("socket");
    13. exit(-1);
    14. }
    15. //2.客户端绑定本地的IP和端口号
    16. struct sockaddr_in addr;
    17. addr.sin_family = AF_INET;
    18. addr.sin_port = htons(9999);
    19. addr.sin_addr.s_addr = INADDR_ANY;
    20. int ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
    21. if(ret ==-1 )
    22. {
    23. perror("bind");
    24. exit(-1);
    25. }
    26. struct ip_mreq op;
    27. inet_pton(AF_INET, "239.0.0.10", &op.imr_multiaddr.s_addr);
    28. op.imr_interface.s_addr = INADDR_ANY;
    29. //加入到多播组
    30. setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &op, sizeof(op));
    31. // 3.通信
    32. while (1)
    33. {
    34. char buf[128];
    35. //接受数据
    36. int num = recvfrom(fd, buf, sizeof(buf), 0, NULL, NULL);
    37. printf("接受组播的数据:%s\n", buf);
    38. }
    39. close(fd);
    40. return 0;
    41. }

  • 相关阅读:
    当成为全球第二大汽车出口国后,中国车企的下一步是什么?
    初探Matrix Android ApkChecker
    对象头(Object Header)
    GLTF和GLB的区别,各自生成方法
    【boot loader】Aurix TC3xx用户手册解读--CAN Bootstrap loader
    spring-Study
    如何制定关于AI伦理的国际标准?
    SpringBoot中Excel的上传
    shiro会话管理
    pytorch-fastrcnn识别王者荣耀敌方英雄血条
  • 原文地址:https://blog.csdn.net/m0_37844072/article/details/126807211