多播 - 没有这样的设备
我正在尝试使用以下代码连接到多播组:
int flag_on = 1; /* socket option flag */
struct sockaddr_in mc_addr; /* socket address structure */
char recv_str[MAX_LEN+1]; /* buffer to receive string */
int recv_len; /* length of string received */
char* mc_addr_str; /* multicast IP address */
unsigned short mc_port; /* multicast port */
struct sockaddr_in from_addr; /* packet source */
unsigned int from_len; /* source addr length */
mc_addr_str = ip; /* arg 1: multicast ip address */
mc_port = port; /* arg 2: multicast port number */
/* validate the port range */
if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) {
fprintf(stderr, "Invalid port number argument %d.\n",
mc_port);
fprintf(stderr, "Valid range is between %d and %d.\n",
MIN_PORT, MAX_PORT);
exit(1);
}
/* create socket to join multicast group on */
// if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
if ((sock = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)) < 0) {
perror("socket() failed");
LOGE("*********Inside Join Multicast -- socket() failed*********");
exit(1);
}
LOGE("Socket value = %d ",sock);
/* set reuse port to on to allow multiple binds per host */
if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
sizeof(flag_on))) < 0) {
perror("setsockopt() failed");
LOGE("*********Inside Join Multicast -- socketopt() failed*********");
exit(1);
}
/* construct a multicast address structure */
memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family = AF_INET;
mc_addr.sin_addr.s_addr = htonl(INADDR_ANY);
mc_addr.sin_port = htons(mc_port);
/* bind to multicast address to socket */
if ((bind(sock, (struct sockaddr *) &mc_addr,
sizeof(mc_addr))) < 0) {
perror("bind() failed");
LOGE("*********Inside Join Multicast -- bind() failed*********");
exit(1);
}
/* construct an IGMP join request structure */
mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str);
mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
/* send an ADD MEMBERSHIP message via setsockopt */
if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void*) &mc_req, sizeof(mc_req))) < 0) {
perror("setsockopt() failed");
LOGE("*********Inside Join Multicast -- socketopt2() failed*********");
LOGE("Value of errno is %s",strerror(errno));
exit(1);
}
并且我收到的错误是 errno 的值是没有这样的设备。
我正在尝试在 omap board - GB 移植上实现这一点。
你能帮忙吗?
I am trying to connect to a multicast group using the following piece of code:
int flag_on = 1; /* socket option flag */
struct sockaddr_in mc_addr; /* socket address structure */
char recv_str[MAX_LEN+1]; /* buffer to receive string */
int recv_len; /* length of string received */
char* mc_addr_str; /* multicast IP address */
unsigned short mc_port; /* multicast port */
struct sockaddr_in from_addr; /* packet source */
unsigned int from_len; /* source addr length */
mc_addr_str = ip; /* arg 1: multicast ip address */
mc_port = port; /* arg 2: multicast port number */
/* validate the port range */
if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) {
fprintf(stderr, "Invalid port number argument %d.\n",
mc_port);
fprintf(stderr, "Valid range is between %d and %d.\n",
MIN_PORT, MAX_PORT);
exit(1);
}
/* create socket to join multicast group on */
// if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
if ((sock = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP)) < 0) {
perror("socket() failed");
LOGE("*********Inside Join Multicast -- socket() failed*********");
exit(1);
}
LOGE("Socket value = %d ",sock);
/* set reuse port to on to allow multiple binds per host */
if ((setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &flag_on,
sizeof(flag_on))) < 0) {
perror("setsockopt() failed");
LOGE("*********Inside Join Multicast -- socketopt() failed*********");
exit(1);
}
/* construct a multicast address structure */
memset(&mc_addr, 0, sizeof(mc_addr));
mc_addr.sin_family = AF_INET;
mc_addr.sin_addr.s_addr = htonl(INADDR_ANY);
mc_addr.sin_port = htons(mc_port);
/* bind to multicast address to socket */
if ((bind(sock, (struct sockaddr *) &mc_addr,
sizeof(mc_addr))) < 0) {
perror("bind() failed");
LOGE("*********Inside Join Multicast -- bind() failed*********");
exit(1);
}
/* construct an IGMP join request structure */
mc_req.imr_multiaddr.s_addr = inet_addr(mc_addr_str);
mc_req.imr_interface.s_addr = htonl(INADDR_ANY);
/* send an ADD MEMBERSHIP message via setsockopt */
if ((setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
(void*) &mc_req, sizeof(mc_req))) < 0) {
perror("setsockopt() failed");
LOGE("*********Inside Join Multicast -- socketopt2() failed*********");
LOGE("Value of errno is %s",strerror(errno));
exit(1);
}
and the error I have received is Value of errno is No such device.
I am trying to achieve this on omap board - GB ported.
Could you please help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
尽管我使用的是 java 接口,但我遇到了非常相似的问题。
就我而言,在我明确指出哪个接口应该处理多播数据包之前,我收到了“没有此类设备”错误。就我而言,这是一个以太网接口。
同样,这并不是你的情况,因为你正在使用 JNI,而且你可能不需要 eth0,但我希望它会有所帮助:
所以我想这个想法是,如果你有超过 1 个接口,你应明确指定您使用的是哪一个。
I had a very similar problem, although I was using java interface.
In my case, I was getting "No such device" error until I explicitly stated which interface should be handling multicast packets. In my case, that was an ethernet interface.
Again this is not quiet your case, since you're using JNI, and also since you probably don't need eth0, but I hope it'll help:
So I guess the idea is that if you have more than 1 interface, you should explicitly specify which one are you using.
您可能没有多播流量的路由。尝试使用:
you probably don't have a route for your multicast traffic. Try with: