在软件设计过程中可能需要发送某个组播或者广播报文,利用指定的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 | 禁止组播数据回送 |