第21章 多播

1·多播(组播)地址:224.0.0.0~139.255.255.255

2·发送多播数据报无需任何特殊处理,发送应用程序不必为此加入多播组

3·多播相对于广播的优势在于不会对多播分组不感兴趣的主机增加额外负担

#include "../Gnet.h"

int main(int argc, const char* argv[])
{
    int sendfd, recvfd;
    const int on = 1;
    //const int off = 0;
    struct sockaddr_in sockaddr;
    socklen_t addrlen;
    struct ip_mreq mreq;
    int nrecv;
    char buf[MAX_LINE];
    char addrstr[INET_ADDRSTRLEN];

    if(argc != 2)
        perr_exit("usage: mcast <IP-multicast-address>");

    sendfd = Socket(AF_INET, SOCK_DGRAM, 0);
    recvfd = Socket(AF_INET, SOCK_DGRAM, 0);

    if(setsockopt(recvfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
        perr_exit("setsockopt error. 22");

    sockaddr.sin_family = AF_INET;
    //sockaddr.sin_port = htons(SERVER_PORT);
    if(inet_pton(AF_INET, argv[1], &sockaddr.sin_addr) < 0)
        perr_exit("inet_pton error.27");
    addrlen = sizeof(sockaddr);
    Bind(recvfd, (struct sockaddr*)&sockaddr, addrlen);//接收套接字绑定多播地址

    mreq.imr_multiaddr = sockaddr.sin_addr;
    //inet_pton(AF_INET, "192.168.17.129", &mreq.imr_interface.s_addr);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);

    if(setsockopt(recvfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) <0)//接收套接字加入多播组
        perr_exit("setsockopt error.35");
    //setsockopt(sendfd, IPPROTO_IP, IP_MULTICAST_LOOP, &off, sizeof(off));
    if(fork() > 0)
    {
        while(1)
        {
            nrecv = recvfrom(recvfd, buf, MAX_LINE, 0, (struct sockaddr*)&sockaddr, &addrlen); 
            printf("from %s: %s\n", 
                   inet_ntop(AF_INET, &sockaddr, addrstr, sizeof(addrstr)), buf);
        }
    }
    else
    {
        while(1)
        {
            sendto(sendfd, "test data", strlen("test data")+1, 0, (struct sockaddr*)&sockaddr, addrlen);
            sleep(2);
        }
    }

    return 0;
}

github:https://github.com/gongluck/unp-notes

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏xingoo, 一个梦想做发明家的程序员

UDP连接代码

由于只有部分代码,自己填不上.......程序未能运行成功,悲剧! server: 1 SOCKET s = ::socket(AF_INET,SOCK_DG...

1738
来自专栏转载gongluck的CSDN博客

UNPv13:#第5章#TCP客户/服务器程序示例

Code github //server.c #include <unistd.h> #include <stdio.h> #include <stdlib....

3245
来自专栏武培轩的专栏

Session 和 Cookie 的区别

会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Ses...

3525
来自专栏bboysoul

httpstat一个实用的网络工具

这个工具可以收集一些网站的基础信息,而且它使用ascii字符的方式显示网站各种连接的时间,方便我们根据这个去优化网站,从而提高网站的连接响应速度。

822
来自专栏JetpropelledSnake

Python Web学习笔记之TCP的3次握手与4次挥手过程

前言 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务。 面向连接意味...

27910
来自专栏ml

socket编程与利用进程进行多并行连接

       呈现一张基本的socket阻塞式模型,如下图: ?  一: 对于一对一的进行C/S回射: 服务端(server.c): 1 #include<u...

2643
来自专栏Laoqi's Linux运维专列

ZABBIX 3.2 监控服务器TCP连接状态

1163
来自专栏散尽浮华

SS命令和Netstat命令比较

在早期运维工作中,查看服务器连接数一般都会用netstat命令。其实,有一个命令比netstat更高效,那就是ss(Socket Statistics)命令! ...

2366
来自专栏吴伟祥

IDEA中的HTTP Client Editor测试API

在前后端分离项目,前后端通过api进行通信。如果用postman免费版进行api测试的话,由于无法保存测试脚本到文件,不方便前端查看。

553
来自专栏jeremy的技术点滴

TCP细节分析

2736

扫描关注云+社区