1

UDP経由で着信するネットワークブロードキャストを聞く必要があります。データグラムにはj4cDAC_broadcast構造体が含まれています。私はいくつかのチュートリアルに従ってみましたが、それらはいくつかのことを省略しているようで、もしあれば、非常に詳細な説明がありません。

私が今持っているもので私はBIND FAILED 10049エラーを受け取ります、そしてエラー10049はアドレスが利用できないことを示します。放送は255.255.255.255:7654に来ています。このエラーを修正するにはどうすればよいですか?

これは私がこれまでに持っているものです:

void test() 
    {
    WSADATA  wsd;
    SOCKET s;
    j4cDAC_broadcast recieve;
    char *read = (char*) malloc(sizeof(j4cDAC_broadcast));
    int ret;
    DWORD dwSenderSize;
    sockaddr_in local;

    if (WSAStartup(MAKEWORD(2,2),&wsd) != 0)
        {
        cout << "WSAStartup failed";
        exit(1);
        }

    local.sin_family = AF_INET;
    local.sin_port = htons ((short)BCASTPORT);
    local.sin_addr.s_addr = inet_addr(BCASTIP);


    s = socket(AF_INET, SOCK_DGRAM, 0 );

    if (s == INVALID_SOCKET)
        {
        cout << "SOCKET FAILED!: " << WSAGetLastError();               
        exit(1);
        }

    int bnd = bind(s,(SOCKADDR*) &local,sizeof(local) );

    if (bnd != 0 )
        {
        cout << "BIND FAILED: " << WSAGetLastError();     //fails here
        return;
        }


    ret = recv (s, read,sizeof(j4cDAC_broadcast),0);

    if (ret == SOCKET_ERROR)
        {
        cout << "RECIEVE FAILED " << WSAGetLastError();            
        return;
        }

    memcpy(&recieve,read,sizeof(read));


    closesocket(s);

    WSACleanup();
    }

また、私が見つけられなかったもう1つのことは、ヘッダーから送信者のIPアドレスを取得する方法でした。

4

1 に答える 1

4

ブローキャストアドレスにバインドしません。マシンのローカルIP(またはそれらすべての場合は0.0.0.0)にバインドします。ブロードキャストはすべて同じようにソケットに到達します。だから放送です。「このパケットはブロードキャストアドレスに送信されます。つまり、受信したい」というロジックは、TCP/IPスタックレベルで発生します。

127.0.0.1にバインドしないでください。

送信者のアドレスを取得するにはrecvfrom()、最後から2番目のパラメーターを使用してメモします。

于 2011-11-05T02:53:14.043 に答える