1

マルチキャスト グループでサービス ポートをアドバタイズする単純な UDP サーバーを作成しようとしていますが、マルチキャストを機能させるのに問題があります。Microsoft のドキュメントを調べてみて、コードの一部をコピーして貼り付けましたが、機能しません。問題のあるコードは次のとおりです。

    this->port = srvc_port; //11129 in my example
    this->mcast_port = mcast_port; //11130 in my example
    this->mcast_ip = mcast_ip; //230.0.0.30 in my example

    int iResult = WSAStartup(MAKEWORD(2,2), &service_wsaData);
    if (iResult != NO_ERROR)
    {
        cout << "WSAstartup failed" << endl;
        return -1;
    }

    service_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (service_sock == INVALID_SOCKET) {
        closesocket(service_sock);
        WSACleanup();
        cout << "Error at socket" << endl;
        return -1;
    }

    mcast_sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if(mcast_sock == INVALID_SOCKET) {
        closesocket(mcast_sock);
        WSACleanup();
        cout << "Error at socket" << endl;
        return -1;
    }

    multicast.sin_family = AF_INET; // multicast is a sockaddr_in struct
    multicast.sin_addr.s_addr = INADDR_ANY;
    multicast.sin_port = htons(mcast_port);

    service.sin_family = AF_INET; //same for service
    service.sin_addr.s_addr = INADDR_ANY;
    service.sin_port = htons(port);

    if(::bind( service_sock, (sockaddr *)&service, sizeof(service) ) == SOCKET_ERROR) {
        closesocket(mcast_sock);
        closesocket(service_sock);
        WSACleanup();
        cout << "Error binding service socket" << endl;
        return -1;
    };

    if(::bind( mcast_sock, (sockaddr *)&multicast, sizeof(multicast) ) == SOCKET_ERROR) {
        closesocket(mcast_sock);
        closesocket(service_sock);
        WSACleanup();
        cout << "Error binding multicast socket" << endl;
        return -1;
    };

    mreq.imr_multiaddr.s_addr = inet_addr(mcast_ip.c_str()); //mreq is declared like so "struct ip_mreq mreq;" in the class
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);

    if(setsockopt(mcast_sock,IPPROTO_IP,IP_ADD_SOURCE_MEMBERSHIP,(char *) &mreq, sizeof(mreq)) == SOCKET_ERROR)
    {
            //I get error 10014 here
        cout << "Error: " << WSAGetLastError() << endl;
        return -1;
    }

どんな助けでも大歓迎です。

4

1 に答える 1

3

10014 は ですWSAEFAULT。これは、「optval パラメーターが指すバッファーがプロセス アドレス空間の有効な部分にないか、optlen パラメーターが小さすぎる」ことを意味します。

ドキュメントを読む:

IPPROTO_IP ソケット オプション

IP_ADD_SOURCE_MEMBERSHIPip_mreq_source構造体へのポインターが必要です。

typedef struct ip_mreq_source {
  struct in_addr  imr_multiaddr;
  struct in_addr  imr_sourceaddr;
  struct in_addr  imr_interface;
} IP_MREQ_SOURCE, *PIP_MREQ_SOURCE;

ip_mreq代わりに、構造体へのポインターを渡しています。

typedef struct ip_mreq {
  struct in_addr  imr_multiaddr;
  struct in_addr  imr_interface;
} IP_MREQ, *PIP_MREQ;

ip_mreqは より小さいためip_mreq_source、 にsizeof(mreq)は小さすぎIP_ADD_SOURCE_MEMBERSHIPます。mreq変数をに変更し、そのメンバーip_mreq_sourceを必ず入力する必要があります。imr_sourceaddr

ip_mreqと に使用されIP_ADD_MEMBERSHIPますIP_DROP_MEMBERSHIP

ip_mreq_sourceIP_ADD_SOURCE_MEMBERSHIPIP_DROP_SOURCE_MEMBERSHIPIP_BLOCK_SOURCE、およびに使用されIP_UNBLOCK_SOURCEます。

于 2014-03-04T02:12:46.367 に答える