linux發送組播報文的socket創建和setsockopt配置

在軟件設計過程中可能需要發送某個組播或者廣播報文,利用指定的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

禁止組播數據回送

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章