Je teste une configuration de socket simple dans laquelle un serveur écoute sur un port spécifié, et un client envoie un paquet de diffusion qui devrait être reçu par ce serveur.UDP WinSock - Ne pas recevoir les paquets de diffusion
Cette configuration fonctionne correctement lors de l'envoi direct de messages (c'est-à-dire sans diffusion), mais lors de la diffusion du paquet n'est jamais reçu sur le serveur.
Une partie du code (dégrossi avec contrôle d'erreurs supprimées, pour simplifier):
// 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");
}
}
Vous pouvez ajouter une vérification d'erreur pour plus de fonctions, comme par exemple les appels 'setsockopt'. –
Vous devez également définir l'option 'SO_BROADCAST' sur le socket que vous voulez * recevoir *. –
@Someprogrammerdude J'ai une erreur de vérification dans le code réel, je l'ai juste supprimé pour cette question. Aucune des fonctions ne retourne d'erreur (à l'exception du WSAEWOULDBLOCK occasionnel, qui est à prévoir pour les sockets non bloquantes). Je pense que j'ai essayé de définir SO_BROADCAST sur le récepteur, mais je vais essayer encore et voir si cela aide. – yothsoggoth