zoukankan      html  css  js  c++  java
  • Linux IPC socket 广播,组播

    getsockopt()/setsockopt()

    //获得sockfd指向的socket的属性
    int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
    //设置sockfd指向的socket的属性,成功返回0,失败返回-1设errno。
    int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
    

    level :选项级别

    • SOL_SOCKET:指定设置属性在socket API层次,即通用socket选项
    • IPPROTO_IP:IP选项。
    • IPPROTO_TCP:TIP选项。

    optname:选项名

    • SO_BROADCAST:广播

    optval:存放选项值的缓冲区地址

    optlen:缓冲区长度

    广播

    广播即向当前网段的所有主机进行广播。广播的信息是在接受方的传输层才决定是否被处理,广播主机的使用当前网段的最大ip地址作为广播地址,即,xxx.xxx.xxx.255,而255.255.255.255在所有网段都是广播地址。 只有使用udp套接字才能广播,而默认设置的socket是不允许发送广播的,需要setsockopt()进行设置

    模型

    sockfd=soket();
    ...
    int on = 1;
    setsockopt(sockfd,SOL_SOCKKET,SO_BROADCAST,&on,sizeof(on));
    ...
    sendto();
    
    

    组播

    广播在接收主机的传输层才会决定是否处理,如果很多主机都是不处理,这种广播风暴无疑会大大的占用带宽并增加主机负载。组播就可以解决既希望实现"一发多收"又不希望引起"广播风暴"的一种机制。组播就是只发消息给组内的主机,而不是网段内所有的主机。

    模型

    //netinet/in.h
    struct ip_mreq{
    	struct in_addr imr_multiaddr;
    	struct in_addr imr_interface;
    };
    
    // 加入多播组
    struct ip_mreq mreq;
    bzero(&mreq,sizeof(mreq));
    mreq.imr_multiaddr.s_addr=inet_addr("224.1.2.2");
    mreq.imr_interface.s_addr=htonl(INADDR_ANY);	
    setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,&mreq,sizeof(mreq));
    
  • 相关阅读:
    HTTP request smuggling
    Do you really know CSS linear-gradients?
    Populating the page: how browsers work
    船舶智能管理系统API文档
    DocGuarder
    BUC LNB 器件
    BUC 与 LNB 的区别
    EIRP G/T 的意义
    语音的频率、频率分辨率、采样频率、采样点数、量化、增益
    机械波、电磁波的异同
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/6032497.html
Copyright © 2011-2022 走看看