Recevoir des réponses à un broadcast UDP

obones Messages postés 2 Date d'inscription mercredi 5 novembre 2008 Statut Membre Dernière intervention 6 novembre 2008 - 5 nov. 2008 à 11:56
obones Messages postés 2 Date d'inscription mercredi 5 novembre 2008 Statut Membre Dernière intervention 6 novembre 2008 - 6 nov. 2008 à 10:31
Bonjour à toutes et tous,

J'essaye actuellement de recevoir des réponses à un broadcast UDP que j'ai envoyé et je parviens pas à faire fonctionner ça. Je vois bien avec WireShark que le datagramme est envoyé et que les réponses arrivent, mais mon code C# ne voit pas les réponses.
Voici comment j'ai codé mon test :

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
{
      // Send data to the broadcast address
      IPEndPoint broadcastIEP = new IPEndPoint(IPAddress.Broadcast, port);
      socket.Connect(broadcastIEP);
      socket.Send(data);

      // Wait for someone to respond
      for (int i = 0; i < 50; i++)
      {
            int availableBytes = socket.Available;
            if (availableBytes > 0)
            {
                  byte[] buffer = new byte[availableBytes];
                  socket.Receive(buffer, 0, availableBytes, SocketFlags.None);

                  return ASCIIEncoding.ASCII.GetString(buffer);
            }
            System.Threading.Thread.Sleep(100);
      }
      return "Nobody replied";
}
finally
{
      socket.Close();
}

L'idée est d'envoyer un broadcast UDP et d'attendre la première machine qui répond. L'attente doit s'arrêter après une durée déterminée.
Je dois forcément faire quelque chose de travers ici, mais je ne vois pas vraiment ce qui me manque. J'ai essayé "ReceiveFrom", mais c'est un appel bloquant et il ne rend jamais la main. Je vois les datagrammes passer (en utilisant WireShark) mais ReceiveFrom ne rend pas la main.

Merci pour votre aide
Olivier

1 réponse

obones Messages postés 2 Date d'inscription mercredi 5 novembre 2008 Statut Membre Dernière intervention 6 novembre 2008
6 nov. 2008 à 10:31
Bon, j'ai encore continué à jouer et finalement j'ai trouvé une solution : Utiliser Send n'était pas une bonen idée et dès que j'ai commencé à utiliser SendTo, ça a marché avec Receive. Cependant il a fallu que j'affecte les options de la socket pour éviter une exception déclenchée par SendTo. Au final, le code est le suivant :

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
try
{
    // The data that needs to be sent
    byte[] data = new byte[122];

    // Fill the data here

    // Send the data
    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
    socket.SendTo(data, new IPEndPoint(IPAddress.Broadcast, port));

    // Wait for responses
    for (int i = 0; i &lt; 100; i++)
    {
        int availableBytes = socket.Available;
        if (availableBytes &gt; 0)
        {
            byte[] buffer = new byte[availableBytes];
            socket.Receive(buffer, 0, availableBytes, SocketFlags.None);

            // Interpret the buffer
            
            // Finally, return the response
            return ASCIIEncoding.ASCII.GetString(buffer);
        }

        System.Threading.Thread.Sleep(100);
    }
    return "Nothing found";
}
finally
{
    socket.Close();
}

Avec ça je reçois les réponses au broadcast que j'envoie.
0
Rejoignez-nous