当前位置: 首页 > 工具软件 > 文播 > 使用案例 >

linux发送组播报文的socket创建和setsockopt配置

公西星文
2023-12-01

在软件设计过程中可能需要发送某个组播或者广播报文,利用指定的ip地址。以下为此代码的实例:

#define SOCKET_INIT    -1

#define DEST_IP  "239.194.0.18"

int localIpAddr = 0xa010101;

int sockOpen(void )
{
    struct ip_mreq  mreq;
    int sock =  SOCKET_INIT ;
    int iTtl = 64;
    UINT32 enMcLb = 0;

    if(0 == localIpAddr)
    {
        return ERROR;
    }

    if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) <= 0)
    {
        printf("[%s] create socket failed\r\n",__func__);
        return ERROR;
    }
    

    //localIpAddr:指的是设备的本地ip

    memset(&ip_mreq,0,sizeof(struct ip_mreq));
    mreq.imr_multiaddr.s_addr = inet_addr(DEST_IP);
    mreq.imr_interface.s_addr = htonl(localIpAddr);
    if(setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) == -1)
    {
        printf("[%s] setsockopt socket IP_ADD_MEMBERSHIP failed\r\n",__func__);
        close(sock);
        sock = SOCKET_INIT ;
    }



    //IP_MULTICAST_LOOP此配置禁止回环

    if (setsockopt(sock, IPPROTO_IP, IP_MULTICAST_LOOP, &enMcLb, sizeof(enMcLb)) == -1)
    {
        printf("[%s] setsockopt socket IP_MULTICAST_LOOP failed\r\n",__func__);
        close(sock);
        sock = SOCKET_INIT ;
    }



    //设置ttl,此设置非必须配置

    if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, (char *)&iTtl, sizeof(iTtl)) == -1)
            || (setsockopt(sock, IPPROTO_IP, IP_TTL, (char *)&iTtl, sizeof(iTtl)) == -1))
    {
        printf("[%s] setsockopt socket TTL failed\r\n",__func__);
        close(sock);
        sock = SOCKET_INIT ;
    }

    return sock;
}

 

此函数的返回值为申请到的可利用指定ip发送组播的socket

其中setsockopt中的一些选项的功能如下:

IP_MULTICAST_TTL

设置多播组数据的TTL值

IP_ADD_MEMBERSHIP

在指定接口上加入组播组

IP_DROP_MEMBERSHIP

退出组播组

IP_MULTICAST_IF

获取默认接口或设置接口

IP_MULTICAST_LOOP

禁止组播数据回送

 类似资料: