接收端代码:
int main()
{
int udp_socket = socket(AF_INET, SOCK_DGRAM,0);
if(udp_socket < 0)
{
cout << "socket fail" << endl;
return -1;
}
struct sockaddr_in local_addr;
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_port = htons(xxxxx);
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(udp_socket,(struct sockaddr*)&local_addr, sizeof(local_addr)) < 0)
{
cout << "bind fail " << endl;
}
//组播结构体
struct ip_mreq vmreq;
//添加组播地址
vmreq.imr_multiaddr.s_addr = inet_addr("239.xxx.xxx.xxx");
vmreq.imr_interface.s_addr=htonl(INADDR_ANY);
//设置组播属性到套接字中
if(setsockopt(udp_socket,IPPROTO_IP,IP_ADD_MEMBERSHIP,&vmreq,sizeof(vmreq)) < 0)
{
cout << "setsockopt fail " << endl;
}
struct sockaddr_in group_addr;
memset(&group_addr,0,sizeof(struct sockaddr_in));
socklen_t addr_len = sizeof(group_addr);
group_addr.sin_family = AF_INET;
group_addr.sin_port = htons(xxxxx);
group_addr.sin_addr.s_addr = inet_addr("239.xxx.xxx.xxx");
while(true)
{
uint8_t buff[2048];
memset(buff,0,sizeof(buff));
int length = recvfrom(udp_socket, &buff, sizeof(buff), 0, (struct sockaddr *) &group_addr, &addr_len);
if(length <= 0)
{
cout << "error and length is " << length << endl;
}
else
{
cout << "success and length is " << length << endl;
}
}
close(udp_socket);
return 0;
}