Linux环境下基于ip组播的通信实现相关代码,怎么一直接收不到数据,求帮忙。

qq_36695163 2017-11-21 05:45:28
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

struct sockaddr_in localSock;
struct ip_mreq group;
int sd;
int datalen;
char databuf[1500];
int i;

int main(int argc, char *argv[])
{
sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0){
perror("Opening datagram socket error");
exit(1);
} else
printf("Opening datagram socket....OK.\n");

{
int reuse = 1;
//设置套接字选项为SO_REUSEADDR,socket可重用,经常在socket通信时进行设置。
if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0){
perror("Setting SO_REUSEADDR error");
close(sd);
exit(1);
} else
printf("Setting SO_REUSEADDR...OK.\n");
}

memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(45969);
localSock.sin_addr.s_addr = inet_addr("127.0.0.1");//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。

//bind()将一本地地址与一套接口捆绑。
if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock))){
perror("Binding datagram socket error");
close(sd);
exit(1);
} else
printf("Binding datagram socket...OK.\n");

group.imr_multiaddr.s_addr = inet_addr("224.0.0.1"); // 组播组的IP地址。
group.imr_interface.s_addr = inet_addr("127.0.0.1");// 本地某一网络设备接口的IP地址。

//IP_ADD_MEMBERSHIP 在指定接口上加入组播组
if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0){
perror("Adding multicast group error");
close(sd);
exit(1);
} else
printf("Adding multicast group...OK.\n");

datalen = sizeof(databuf);

/*if(i=recvfrom(sd,databuf,10,0,(struct sockaddr*)& localSock,(socklen_t*)&datalen)<0){*/
if(i=read(sd, databuf, datalen) < 0){
perror("Reading datagram message error");
close(sd);
exit(1);
} else {
printf("iiii %d bytes data.\n", i);
printf("Reading datagram message...OK.\n");
printf("The message from multicast server is: %s\n", databuf);
}

return 0;
}

发送组播数据:
通过本机指定端口号发送数据到组播224.0.0.1.
...全文
411 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
代码誊写工 2017-11-24
  • 打赏
  • 举报
回复
发送端没有必要设置什么,只要网224.0.0.1发送udp报文就已经是组播了。你把那两句setsockopt去掉
代码誊写工 2017-11-22
  • 打赏
  • 举报
回复
localSock.sin_addr.s_addr = inet_addr("127.0.0.1");
改为:
localSock.sin_addr.s_addr = INADDR_ANY;
qq_36695163 2017-11-22
  • 打赏
  • 举报
回复
引用 4 楼 prolee750607 的回复:
那估计就是发送端的问题了。 端口是一致的吗? 我这里测过你的代码,肯定可以收到。 你贴出你发送端的代码看看
老兄,发送端出现了这个问题
qq_36695163 2017-11-22
  • 打赏
  • 举报
回复
引用 4 楼 prolee750607 的回复:
那估计就是发送端的问题了。 端口是一致的吗? 我这里测过你的代码,肯定可以收到。 你贴出你发送端的代码看看
#include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> struct in_addr localInterface; struct sockaddr_in groupSock; int sd; char databuf[1024] = "Multicast test message lol!"; int datalen = sizeof(databuf); int i; int main (int argc, char *argv[ ]) { /* 创建要发送的数据报套接字. */ sd = socket(AF_INET, SOCK_DGRAM, 0); if(sd < 0) { perror("Opening datagram socket error"); exit(1); } else printf("Opening the datagram socket...OK.\n"); /*初始化224.0.0.1和端口组地址的组结构体。* / memset((char *) &groupSock, 0, sizeof(groupSock)); groupSock.sin_family = AF_INET; groupSock.sin_addr.s_addr = inet_addr("224.0.0.1"); groupSock.sin_port = htons(45969); //4321 /* 禁用回送你不接受你自己的数据报. { char loopch = 0; if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&loopch, sizeof(loopch)) < 0) { perror("Setting IP_MULTICAST_LOOP error"); close(sd); exit(1); } else printf("Disabling the loopback...OK.\n"); } */ /*出境多播数据报设置本地接口. */ /* 指定的IP地址必须与本地关联 */ /* 组播接口. */ localInterface.s_addr = inet_addr("127.0.0.1"); if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0) { perror("Setting local interface error"); exit(1); } else printf("Setting the local interface...OK\n"); /* 发送消息的groupsock sockaddr结构指定的多播组。 */ /*int datalen = 1024;*/ if(sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0) {perror("Sending datagram message error");} else printf("Sending datagram message...OK\n"); / return 0; }
代码誊写工 2017-11-22
  • 打赏
  • 举报
回复
那估计就是发送端的问题了。 端口是一致的吗? 我这里测过你的代码,肯定可以收到。 你贴出你发送端的代码看看
qq_36695163 2017-11-22
  • 打赏
  • 举报
回复
引用 2 楼 prolee750607 的回复:
localSock.sin_addr.s_addr = inet_addr("127.0.0.1");
改为:
localSock.sin_addr.s_addr = INADDR_ANY;
兄弟,还是没有收到数据呀
代码誊写工 2017-11-21
  • 打赏
  • 举报
回复
没有仔细看代码,但先普及一下: DGRAM是UDP UDP是无连接协议 无连接协议没有要求必须ack(打个比方,事实上这个报文在udp里不存在),你发你的,我没必要告诉你我收没收着。 就是: 如果你是暗恋者,你必须付出不止一辈子(甚至你的祖上和后辈),但她永远不知道也从不在乎你的存在,流媒体就是这样的,这是一个美德,一个人类很重要的美德。

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧