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