簡體   English   中英

UDP WinSock-不接收廣播數據包

[英]UDP WinSock - Not Receiving Broadcast Packets

我正在測試一個簡單的套接字設置,其中服務器在指定的端口上偵聽,並且客戶端發送應該由該服務器接收的廣播數據包。

直接發送消息時(即不廣播),但在廣播時,服務器上永遠不會接收到數據包,此設置可以正常工作。

一些代碼(為簡化起見,刪除了錯誤檢查后進行了整理):

// Client (broadcast sender)

// Create and bind the client socket
clientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(5678);
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

bind(clientSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr));

u_long uMode = 1;
ioctlsocket(clientSocket, FIONBIO, &uMode);

char broadcast = 1;
setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast));

// ...

// Send the packet
sockaddr_in sockAddress;
sockAddress.sin_family = AF_INET;
sockAddress.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST);
sockAddress.sin_port = htons(5679);

char const* pPacket = "Test";
size_t uPacketSize = strlen(pPacket) + 1;

sendto(clientSocket, pPacket, (int)uPacketSize, 0, (sockaddr*)&sockAddress, sizeof(sockAddress));

-

// Server (listener)

// Create and bind the server socket
serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

sockaddr_in sockAddr;
sockAddr.sin_family = AF_INET;
sockAddr.sin_port = htons(5679);
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

bind(serverSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr));

u_long uMode = 1;
ioctlsocket(serverSocket, FIONBIO, &uMode);

// ...

char pBuffer[1024];
while (true)
{
    int iRecvSize = recv(serverSocket, pBuffer, 1024, 0);
    if (iRecvSize)
    {
        printf("Received packet\n");
    }
}

(應該是評論,但我的聲譽不夠高)

我不知道這是否適用於您,但是最新版本的Windows上的廣播存在一種不直觀的行為。 如果您有多個物理以太網適配器,則只能在“首選”接口(其中“首選”由Windows的路由表確定)上接收廣播。

請參閱以下內容以獲得解釋和可能的修復方法: https : //github.com/dechamps/WinIPBroadcast

另一個臨時解決方案是禁用所有其他網絡適配器,以確保在正確的適配器上(在“控制面板/網絡和共享中心/更改適配器”設置中)接收到廣播。

暫無
暫無

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

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