linux udp组播收不到数据包,组播收不到数据
void udpclient(int argc, char **argv){int myFd, clientFd;struct sockaddr_in myAddr, clientAddr;struct ip_mreq mreq;int addrlen = sizeof(clientAddr);char buf[MAXBUF];char addrTemp[INET_ADDRSTRLEN];int
void udpclient(int argc, char **argv)
{
int myFd, clientFd;
struct sockaddr_in myAddr, clientAddr;
struct ip_mreq mreq;
int addrlen = sizeof(clientAddr);
char buf[MAXBUF];
char addrTemp[INET_ADDRSTRLEN];
int db_Value=0;
int i,fd_pipe_w;
rt_memset(&myAddr, 0,sizeof(myAddr));
rt_memset(&clientAddr, 0,sizeof(clientAddr));
//创建套接字,datagrams
if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
}
//设置本地地址端口信息
myAddr.sin_family = AF_INET;
myAddr.sin_addr.s_addr = INADDR_ANY;
if (argc == 3) {
myAddr.sin_port = htons(atoi(argv[2]));
} else {
myAddr.sin_port = htons(PORT);
}
//绑定本地套接字
if(bind(myFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) != 0) {
}
//设置IP_MULTICAST_LOOP
unsigned char loop = 1;
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) {
return ;
}
//设置IP_MULTICAST_TTL 为1,即该多播最多只能经过一个路由器
unsigned char ttl = 1;
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
return ;
}
//对struct ip_mreq这个结构体赋值
if (argc > 1) { //设置IP地址
int res;
if ((res = inet_pton(AF_INET, argv[1], &mreq.imr_multiaddr)) == -1) {
exit(errno);
} else if(res == 0) {
rt_kprintf("IP地址无效\n");
rt_kprintf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255\n");
return ;
}
} else {
rt_kprintf("Usage:%s 多播地址(224.0.0.1 ~ 239.255.255.255)\n", argv[0]);
return ;
}
mreq.imr_interface.s_addr = INADDR_ANY;
//将本机加入多播组中
if (setsockopt (myFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
exit(errno);
}
rt_kprintf("Multicast is starting,waitting for information of Multicast.....\n");
while (1)
{
rt_memset(buf, 0,sizeof(buf));
rt_kprintf("wait UDP data\r\n");
if (recvfrom(myFd, buf, sizeof(buf) - 1, 0, (struct sockaddr *)&clientAddr, &addrlen) == -1)
{
return ;
}
rt_kprintf(".......\r\n");
/* 线程休眠一段时间 */
rt_thread_delay(50);
}
//退出广播组
if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
exit(errno);
}
return;
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)