Networking 一个网络中的计算机无法接收多播发送的消息

Networking 一个网络中的计算机无法接收多播发送的消息,networking,udp,winsock,multicast,Networking,Udp,Winsock,Multicast,如果这不是一个有用的问题,我很抱歉。我不熟悉套接字编程。我必须构建一个多播应用程序(带有接收方和发送方),它只需使用多播向一个网络中的一组主机发送消息。我使用winsock库在windows上用C构建了它 问题是,当我将receiver.exe复制到另一台计算机(在同一网络中)并运行sender.exe时,接收方无法接收消息。我想我的网络调制解调器需要配置一些东西来重新组织多播地址。我不明白网络是如何管理多播组的,多播地址“239.255.10.10”是我的随机值 这是发送方(对于较短的源代码,

如果这不是一个有用的问题,我很抱歉。我不熟悉套接字编程。我必须构建一个多播应用程序(带有接收方和发送方),它只需使用多播向一个网络中的一组主机发送消息。我使用winsock库在windows上用C构建了它

问题是,当我将receiver.exe复制到另一台计算机(在同一网络中)并运行sender.exe时,接收方无法接收消息。我想我的网络调制解调器需要配置一些东西来重新组织多播地址。我不明白网络是如何管理多播组的,多播地址“239.255.10.10”是我的随机值

这是发送方(对于较短的源代码,我忽略了所有错误检查,因为在创建套接字或setsockopt时没有发生错误,…):

这是接收器:

#define DEFAULT_ADDR "239.255.10.10"
#define DEFAULT_PORT "4321"
#define MAX_LEN 1024

int main(int argc, char *argv[]) {
    WSADATA WsaDat;
    int sock;
    int flag_on = 1;
    struct sockaddr_in mc_addr;
    struct ip_mreq mc_req;
    char message[MAX_LEN+1];
    struct sockaddr_in from_addr;
    int from_len;

    WSAStartup(MAKEWORD(2,2), &WsaDat);

    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&flag_on, sizeof(flag_on));

    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(atoi(DEFAULT_PORT));

    bind(sock, (struct sockaddr *) &mc_addr, sizeof(mc_addr));

    /* Construct an IGMP join request structure */
    mc_req.imr_multiaddr.s_addr = inet_addr(DEFAULT_ADDR);
    mc_req.imr_interface.s_addr = htonl(INADDR_ANY);

    /* Send an ADD MEMBERSHIP message via setsockopt */
    setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mc_req, sizeof(mc_req));

    printf("Multicast socket ready!/nWaiting for message ...\n");

    while(1) {
        // clear buffer
        memset(message, 0, sizeof(message));
        from_len  =  sizeof(from_addr) ; 
        memset(&from_addr, 0,  from_len); 

        recvfrom(sock, message, MAX_LEN, 0, 
            (struct sockaddr*)&from_addr, &from_len);

        printf("Received %s from %s: ", message, inet_ntoa(from_addr.sin_addr));
    }
}
我会写

message_len=strlen(message)+1

在发送之前,还要发送终止的空字符

我还将尝试在同一台PC上测试发送方和接收方,以了解这是否是网络问题。

我会这样写

message_len=strlen(message)+1

在发送之前,还要发送终止的空字符


我还会尝试在同一台电脑上测试发送方和接收方,以了解这是否是网络问题。

我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。谢谢!我会记在心里的:你的问题毫无意义。如果另一台计算机在同一网络中,则网络调制解调器与此问题无关。网络调制解调器将您连接到另一个网络。我已编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。谢谢!我会记在心里的:你的问题毫无意义。如果另一台计算机在同一网络中,则网络调制解调器与此问题无关。网络调制解调器将您连接到另一个网络。
#define DEFAULT_ADDR "239.255.10.10"
#define DEFAULT_PORT "4321"
#define MAX_LEN 1024

int main(int argc, char *argv[]) {
    WSADATA WsaDat;
    int sock;
    int flag_on = 1;
    struct sockaddr_in mc_addr;
    struct ip_mreq mc_req;
    char message[MAX_LEN+1];
    struct sockaddr_in from_addr;
    int from_len;

    WSAStartup(MAKEWORD(2,2), &WsaDat);

    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&flag_on, sizeof(flag_on));

    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(atoi(DEFAULT_PORT));

    bind(sock, (struct sockaddr *) &mc_addr, sizeof(mc_addr));

    /* Construct an IGMP join request structure */
    mc_req.imr_multiaddr.s_addr = inet_addr(DEFAULT_ADDR);
    mc_req.imr_interface.s_addr = htonl(INADDR_ANY);

    /* Send an ADD MEMBERSHIP message via setsockopt */
    setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mc_req, sizeof(mc_req));

    printf("Multicast socket ready!/nWaiting for message ...\n");

    while(1) {
        // clear buffer
        memset(message, 0, sizeof(message));
        from_len  =  sizeof(from_addr) ; 
        memset(&from_addr, 0,  from_len); 

        recvfrom(sock, message, MAX_LEN, 0, 
            (struct sockaddr*)&from_addr, &from_len);

        printf("Received %s from %s: ", message, inet_ntoa(from_addr.sin_addr));
    }
}