2016-06-07 12 views
0

Ich verwende den folgenden Code, um eine Nachricht zu empfangen (ich benutze diesen Weg, weil ich etwas mache, während ich auf die Nachrichten warte) Aber ich habe diese Verbindung getestet und sende Nachrichten sehr nahe einander, aber es scheint, als ob einer von ihnen verloren geht. Ich habe keine Ahnung, wie ich das beheben kann. Wie kann ich die Option 'Puffer lesen' oder etwas Ähnliches aktivieren?Puffer für asynchrone Udp-Nachrichten

Dank .. hier ist der Code:

// Funktion UDP-Nachricht

public static void ReceiveCallback(IAsyncResult ar) 
    { 

     UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 

     //IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

     Byte[] receiveBytes = u.EndReceive(ar, ref IpEndPoint_groupEP); 
     received_data_from_client = Encoding.ASCII.GetString(receiveBytes); 
     messageReceived = true; 
     Logger("Received a message from : " + IpEndPoint_groupEP.ToString()); 
     u.Close(); 
    } 

    public static void ReceiveMessages() 
    { 

     IpEndPoint_groupEP.Address = (IPAddress.Any); 
     IpEndPoint_groupEP.Port = listenPort; 

     //IPEndPoint e = new IPEndPoint(IPAddress.Any, listenPort); 

     UdpClient u = new UdpClient(IpEndPoint_groupEP); 

     UdpState s = new UdpState(); 

     s.e = IpEndPoint_groupEP; 
     s.u = u; 

     u.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    while (!messageReceived) 
      { 
        Thread.Sleep(50); 
Console.writeLine("Hello") 


} 

Ich habe die u.close zu erhalten, da diese Funktion mehr als ein aufgerufen wird. Ich habe eine while-Schleife, also liest das Programm die Nachrichten und macht etwas mit der Nachricht. Wenn es fertig ist, springt es zurück und ruft die Funktion ReceiveMessages auf, um mit dem Lesen einer anderen Nachricht zu beginnen. Und im Grunde, wenn das Programm keine Nachricht erhalten hat, ruft es "Hallo"

Es funktioniert wie ein Charme. Allerdings merkte ich, wenn zwei oder mehr Nachrichten zur gleichen Zeit ankommen, es liest nur eine von ihnen und ich verliere die anderen

+1

Sie 'u.Close()' in 'ReceiveCallback', warum erwarten Sie, dass es mehr als einmal funktioniert? –

+0

Sorry, ich habe gerade aktualisiert .. – George

Antwort

1

Das Problem ist, dass Sie den Port zwischen Nachrichten schließen. Anstatt dass die Schaffung des Hafens außerhalb von ReceiveMessages()

public static void ReceiveCallback(IAsyncResult ar) 
{ 

    UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; 

    //IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; 

    Byte[] receiveBytes = u.EndReceive(ar, ref IpEndPoint_groupEP); 
    received_data_from_client = Encoding.ASCII.GetString(receiveBytes); 
    messageReceived = true; 
    Logger("Received a message from : " + IpEndPoint_groupEP.ToString()); 
} 

public static UdpClient CreateClient() 
{ 
    IpEndPoint_groupEP.Address = (IPAddress.Any); 
    IpEndPoint_groupEP.Port = listenPort; 

    UdpClient u = new UdpClient(IpEndPoint_groupEP); 
    return u; 
} 

public static void ReceiveMessages(UdpClient u) 
{ 

    UdpState s = new UdpState(); 

    s.e = IpEndPoint_groupEP; 
    s.u = u; 

    u.BeginReceive(new AsyncCallback(ReceiveCallback), s); 

    while (!messageReceived) 
    { 
      Thread.Sleep(50); 
      Console.writeLine("Hello") 
    } 
} 

jedoch bewegen zu tun, weil das einzige, was Sie tun, nachdem Sie BeginReceive tun ist, beginnen in einer Warteschleife, nichts zu tun, möchten Sie vielleicht zu prüfen, von der Asynchron loszuwerden Rückruf und rufen Sie einfach Receive direkt und blockieren Sie auf diese.

+0

Hallo, Vielen Dank für Ihre Antwort. Ich mache gerade etwas während der while-Schleife, aber es macht eine Menge Sachen und aus Gründen der Einfachheit für den Code wollte ich es nicht in die Frage aufnehmen. Ich werde Ihre Methode ausprobieren und werde Sie wissen lassen, ob es funktioniert oder nicht! – George

+0

Hallo, Als ich die Lösung ausprobiert habe, habe ich folgenden Fehler: System.Net.Sockets.SocketException (0x80004005): Normalerweise ist nur eine Verwendung jeder Socket-Adresse (Protokoll/Netzwerkadresse/Port) bei System.Net.Sockets erlaubt .Socket.DoBind (EndPoint endPointSnapshot, SocketAddress socketAddress) bei System.Net.Sockets.Socket.Bind (EndPoint localEP) bei System.Net.Sockets.UdpClient..ctor (IPEndPoint localEP) – George

+1

Sie sollten CreateClient nur aufrufen 'einmal, rufen Sie' ReceiveMessages' mehrmals auf, übergeben aber den gleichen 'UdpClient' als Parameter. –