簡體   English   中英

在C ++中接收尋址到255.255.255.255的廣播數據包

[英]Receiving broadcast packet addressed to 255.255.255.255 in C++

我有一個通過將廣播數據包發送到端口4930上的255.255.255.255而發現的設備,並且該設備通過將數據包發送回端口4930上的255.255.255.255進行了發現。

我有一段C ++代碼,可以將數據包發送到端口4930(源端口和目標端口)上的255.255.255.255,但它無法接收來自廣播地址255.255.255.255的數據包。

我可以看到設備運行良好,wireshark可以看到來回的數據包,並且設備隨附的專有軟件可以很好地發現設備,問題出在C ++程序上,所以請繼續關注您的回答。

現在,正如我已經說過的,我可以發送一個僅找到的數據包,但是首先,我無法綁定到IP地址255.255.255.255來接收數據包。 我可以將多播地址更改為239.255.255.250,套接字將綁定,但我需要地址255.255.255.255。

我的代碼段如下,我正在使用VC ++ 2010

bool CPTUProgramDlg::FindPTU(u_short port, const char * Destaddress){
    {
        //Data to send
        char packet_data[10] = {0x44,0x43,0x55,0x44,0x5f,0x50,0x49,0x4e,0x47,0x00};
        int packet_size=10;

        SOCKET sock;
        struct sockaddr_in addr;

        sock = socket(AF_INET, SOCK_DGRAM, 0);

        // set SO_BROADCAST on a socket to true (1): (so we can transmit to 255 addr)
        //In order to use broadcast the options of socket must change
        char broadcastON = 1;
        setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &broadcastON, sizeof broadcastON);

        if (sock < 0)
            return false;

        addr.sin_family = AF_INET;
        addr.sin_port = htons(port);
        addr.sin_addr.s_addr = inet_addr(Destaddress); // Specify dest IP

        sendto(sock, packet_data, packet_size, 0, (struct sockaddr*)&addr, sizeof(addr));

        if (bind(sock,(struct sockaddr*) &addr,sizeof(addr)) != -1){
            char Buff[512];
            recv(sock,Buff,512,0);
        }

        closesocket(sock);
    }

    return 1;
}

Wireshark屏幕截圖可證明正在發送數據包:

在此處輸入圖片說明

從wireshark輸出中可以看到,特殊設備正在使用廣播進行通信,並將使用與源和目標相同的端口號。

正常的套接字通信將需要使用匹配的端口號,但是廣播消息無法在同一套接字上交換,尤其是當端口號與wireshark不一致時。

通常,可以在255.255.255.255( INADDR_BROADCAST )上進行綁定,但是可能會受到操作系統特權和權限的限制。

您可以嘗試使用兩個套接字來解決該問題-一個用於接收,另一個用於發送。 當然,必須先設置監聽套接字,並將其綁定到0.0.0.0( INADDR_ANY )和端口4930。在這種情況下,沒有簡單的方法可以按目標地址進行過濾(因為我在注釋中寫錯了),因為大多數標准套接字API沒有提供從套接字獲取目標地址的方法。 在Linux上有一個例外IP_PKTINFO上的SOL_IP ...

通過使用recvfrom,您將獲得響應設備的源單播地址。 您必須注意,如果您的網絡上有不止一個這樣的設備,您將獲得不止一個響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM