UDP WinSock — не получает широковещательные пакеты

Я тестирую простую настройку сокета, в которой сервер прослушивает указанный порт, а клиент отправляет широковещательный пакет, который должен быть получен этим сервером.

Эта настройка прекрасно работает при отправке сообщений напрямую (т. Е. Без широковещательной передачи), но при широковещательной передаче пакет никогда не принимается на сервере.

Часть кода (для простоты урезана проверка ошибок):

// 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");
}
}

0

Решение

(Должен быть комментарий, но моя репутация недостаточно высока)

Я не знаю, относится ли это к вам, но в последних версиях Windows происходит неинтуитивное поведение с трансляциями. Если у вас есть несколько физических адаптеров Ethernet, широковещательные сообщения будут приниматься только на «предпочтительном» интерфейсе (где «предпочтение» определяется таблицей маршрутизации Windows)

Смотрите следующее для объяснения и возможного исправления:
https://github.com/dechamps/WinIPBroadcast

Другим временным исправлением будет отключение всех других сетевых адаптеров, чтобы убедиться, что широковещательная рассылка принимается на правильном (в Панели управления / Центр управления сетями и общим доступом / Изменить настройки адаптера).

0

Другие решения

Других решений пока нет …