1

これが有用な質問でない場合は申し訳ありません。私はソケットプログラミングが初めてです。そして、マルチキャストを使用して1つのネットワーク内のホストのグループにメッセージを送信するだけのマルチキャストアプリケーション(受信者と送信者を含む)を構築する必要があります。winsock ライブラリを使用して、windows で C でビルドしました。

問題は、receiver.exe を別のコンピューター (同じネットワーク内) にコピーして sender.exe を実行すると、受信者がメッセージを受信できないことです。マルチキャスト アドレスを認識するようにネットワーク モデムを構成する必要があると思います。ネットワークがどのようにマルチキャスト グループを管理しているのかよくわかりません。マルチキャスト アドレス「239.255.10.10」はランダムな値です。

これは送信者です(短いソースコードの場合、ソケットまたはsetsockoptの作成中にエラーが発生しなかったため、すべてのエラーチェックを無視しました...):

#define DEFAULT_ADDR "239.255.10.10" // a random value
#define DEFAULT_PORT 4321

int main(int argc, char *argv[])
{
    WSADATA WsaDat;
    struct sockaddr_in mc_addr;
    int sock;
    char *message = "My message";
    int message_len;
    const char mc_ttl = 1;

    WSAStartup(MAKEWORD(2,2), &WsaDat)!=0;

    // Create a socket for sending to the multicast address
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

    // Set the TTL (time to live/ hop count) for the sender
    setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, &mc_ttl, sizeof(mc_ttl));

    memset(&mc_addr, 0, sizeof(mc_addr));
    mc_addr.sin_family = AF_INET;
    mc_addr.sin_addr.s_addr = inet_addr(DEFAULT_ADDR);
    mc_addr.sin_port = htons(DEFAULT_PORT);

    message_len = strlen(message);
    sendto(sock, message, message_len, 0, (struct sockaddr*)&mc_addr, sizeof(mc_addr));
    printf("Message sent\n");

    system("PAUSE");
    closesocket(sock);

    WSACleanup();
}

そして、これは受信機です:

#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));
    }
}
4

1 に答える 1

1

私は書くだろう

message_len = strlen(メッセージ) + 1;

送信する前に、終端のヌル文字も送信します。

また、これがネットワークの問題であるかどうかを理解するために、同じ PC で送信側と受信側の両方をテストしようとします。

于 2013-05-25T09:28:24.950 に答える