[英]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.