18,356
社区成员
发帖
与我相关
我的任务
分享
#define MCAST_PORT 8888
#define MCAST_ADDR "224.0.0.100"
#define MCAST_INTERVAL 5
#define BUFF_SIZE 256
void MultiClientThread(const char* url, int port){
int socketfd; /*套接字文件描述符*/
struct sockaddr_in local_addr; /*本地地址*/
int err = -1;
socketfd = socket(AF_INET, SOCK_DGRAM, 0); /*建立套接字*/
if (socketfd == -1)
{
DBGPRINT_LWIP("MulticastClient socket()\r\n");
return ;
}
memset(&local_addr, 0, sizeof(local_addr));
local_addr.sin_family = AF_INET;
local_addr.sin_addr.s_addr = htonl(INADDR_ANY);
local_addr.sin_port = htons(MCAST_CLIENT_PORT);
/*绑定socket*/
err = bind(socketfd,(struct sockaddr*)&local_addr, sizeof(local_addr)) ;
if(err < 0)
{
DBGPRINT_LWIP("bind()");
return ;
}
int loop = 1;
err = getsockopt(socketfd, SOL_SOCKET, SO_SNDBUF, &loop, sizeof(loop));
if(err < 0)
{
DBGPRINT_LWIP("getsockopt():SO_REUSEADDR error\r\n");
return ;
}
err = setsockopt(socketfd,SOL_SOCKET, SO_REUSEADDR,&loop, sizeof(loop));
if(err < 0)
{
DBGPRINT_LWIP("setsockopt():SO_REUSEADDR error\r\n");
return ;
}
struct ip_mreq mreq; /*加入多播组*/
mreq.imr_multiaddr.s_addr = inet_addr(MCAST_ADDR); /*多播地址*/
mreq.imr_interface.s_addr = htonl(INADDR_ANY); /*网络接口为默认*/
/*将本机加入多播组*/
err = setsockopt(socketfd, IPPROTO_IP, IP_ADD_MEMBERSHIP,&mreq, sizeof(mreq));
if (err < 0)
{
DBGPRINT_LWIP("setsockopt():IP_ADD_MEMBERSHIP error\r\n");
return ;
}
else{
DBGPRINT_LWIP("setsockopt():IP_ADD_MEMBERSHIP OK!\r\n");
}
int times = 0;
int addr_len = 0;
char buff[BUFF_SIZE];
int n = 0;
/*循环接收多播组的消息,5次后退出*/
while(1)
{
addr_len = sizeof(local_addr);
memset(buff, 0, BUFF_SIZE); /*清空接收缓冲区*/
/*接收数据*/
n = lwip_recvfrom(socketfd, buff, BUFF_SIZE, 0,(struct sockaddr*)&local_addr,&addr_len);
if( n== -1)
{
DBGPRINT_LWIP("recvfrom()\r\n");
}
/*打印信息*/
DBGPRINT_LWIP("Recv %dst message from server:%s\n", times, buff);
sleep(MCAST_INTERVAL);
}
err = lwip_setsockopt(socketfd, IPPROTO_IP, IP_DROP_MEMBERSHIP,&mreq, sizeof(mreq));
close(socketfd);
}