首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果启用了环回,为什么发送方没有收到其组播UDP数据包?

如果启用了环回,为什么发送方没有收到其组播UDP数据包?
EN

Stack Overflow用户
提问于 2014-09-19 06:01:16
回答 3查看 2.7K关注 0票数 0

在过去的两天里,由于以下问题而苦苦挣扎:如果发送者订阅了组播组,那么环回的数据包是否会通过接入点返回发送者?即使不是这样,也有可能通过AP强制环回吗?

另外,为什么loopback不能与以下代码一起工作?

代码语言:javascript
运行
复制
char * server_addr_name = "239.255.0.1"; // multicast group
int port_number = 8888;
int enable_loopback = 1;
int udp_socket;
struct message msg; // random message
char buffer[BUFFER_SIZE];

/* create socket */
struct sockaddr_in server_addr, rcv_addr;
socklen_t server_addr_size = sizeof(struct sockaddr_in);
socklen_t rcv_addr_size = sizeof(struct sockaddr_in);

/* initialize socket */
memset(& server_addr, 0, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(server_addr_name);
server_addr.sin_port = htons(port_number);
if ((udp_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
    fprintf(stderr, "Error initializing UDP socket.\n");
    exit(EXIT_FAILURE);
}

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr(server_addr_name);
mreq.imr_interface.s_addr = htonl(INADDR_ANY);
if (setsockopt(udp_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, & mreq, sizeof(mreq)) < 0) {
    fprintf(stderr, "Error on setting multicast membership on socket.\n");
    exit(EXIT_FAILURE);
}
unsigned char do_enable = (unsigned char) enable_loopback;
if (setsockopt(udp_socket, IPPROTO_IP, IP_MULTICAST_LOOP,
               & do_enable, sizeof(do_enable)) < 0) {
    fprintf(stderr, "Error on setting multicast loopback on socket.\n");
    exit(EXIT_FAILURE);
}

int read_size = 0;
while (1) {

    /* send the packet */
    if (sendto(udp_socket, &msg, sizeof(struct message), 0,
            (struct sockaddr *) & server_addr, server_addr_size) == -1) {
        fprintf(stderr, "Error on sending UDP packet.\n");
    }
    else
        printf("Sent my message.\n");

    /* get response from the server/multicast address */
    read_size = recvfrom(udp_socket, buffer, BUFFER_SIZE, 0,
                            (struct sockaddr *) & rcv_addr, & rcv_addr_size);
    if (read_size < 1)
        break;
    else
        printf("Got my packet!\n");
}

感谢您的帮助。

EN

Stack Overflow用户

发布于 2015-05-11 20:52:16

只是在和同样的问题作斗争。Linux不会在相同的套接字上镜像数据包,即使它与address:port匹配。您应该创建另一个套接字udp_socket_receiver,方法与您的udp_socket和recvfrom的工作方式相同。看起来IP_MULTICAST_LOOP意味着在除发送器套接字之外的所有侦听器上本地循环回多播数据包。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25923117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档