Ich möchte dieseWie UdpClient.BeginReceive in einer Schleife verwenden
for (int i = 0; i < 100; i++)
{
Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
}
tun, sondern stattdessen UdpClient.Receive
zu verwenden, ich habe UdpClient.BeginReceive
zu verwenden. Das Problem ist, wie mache ich das? Es gibt nicht viele Beispiele, die BeginReceive
verwenden, und das MSDN-Beispiel hilft überhaupt nicht. Soll ich BeginReceive
verwenden oder einfach unter einem separaten Thread erstellen?
Ich bekomme konsequent ObjectDisposedException
Ausnahme. Ich bekomme nur die ersten Daten gesendet. Die nächsten Daten werden eine Ausnahme auslösen.
public class UdpReceiver
{
private UdpClient _client;
public System.Net.Sockets.UdpClient Client
{
get { return _client; }
set { _client = value; }
}
private IPEndPoint _endPoint;
public System.Net.IPEndPoint EndPoint
{
get { return _endPoint; }
set { _endPoint = value; }
}
private int _packetCount;
public int PacketCount
{
get { return _packetCount; }
set { _packetCount = value; }
}
private string _buffers;
public string Buffers
{
get { return _buffers; }
set { _buffers = value; }
}
private Int32 _counter;
public System.Int32 Counter
{
get { return _counter; }
set { _counter = value; }
}
private Int32 _maxTransmission;
public System.Int32 MaxTransmission
{
get { return _maxTransmission; }
set { _maxTransmission = value; }
}
public UdpReceiver(UdpClient udpClient, IPEndPoint ipEndPoint, string buffers, Int32 counter, Int32 maxTransmission)
{
_client = udpClient;
_endPoint = ipEndPoint;
_buffers = buffers;
_counter = counter;
_maxTransmission = maxTransmission;
}
public void StartReceive()
{
_packetCount = 0;
_client.BeginReceive(new AsyncCallback(Callback), null);
}
private void Callback(IAsyncResult result)
{
try
{
byte[] buffer = _client.EndReceive(result, ref _endPoint);
// Process buffer
MainWindow.Log(Encoding.ASCII.GetString(buffer));
_packetCount += 1;
if (_packetCount < _maxTransmission)
{
_client.BeginReceive(new AsyncCallback(Callback), null);
}
}
catch (ObjectDisposedException ex)
{
MainWindow.Log(ex.ToString());
}
catch (SocketException ex)
{
MainWindow.Log(ex.ToString());
}
catch (System.Exception ex)
{
MainWindow.Log(ex.ToString());
}
}
}
Was gibt?
By the way, die allgemeine Idee ist:
- tcpclient Manager erstellen.
- Starten Sie das Senden/Empfangen von Daten mit udpclient.
- Wenn alle Daten gesendet wurden, signalisiert der Tcpclient Manager dem Empfänger, dass alle Daten gesendet wurden, und die Verbindung zum udpclient sollte geschlossen werden.
Sie wissen natürlich, dass UDP ist ein Protokoll, das Pakete verlieren kann und nicht die Einzigartigkeit noch Ordnung nicht garantieren, so versuchen, 100 Pakete von einem bestimmten Endpunkt erhalten nicht unbedingt Mittel dass Sie die gleichen 100 Pakete in der Reihenfolge erhalten haben, die gesendet wurden? Vielleicht solltest du TCP benutzen? –
Ich bin mir dessen vollkommen bewusst. Der Grund dafür ist, weil ich die Verbindung zwischen zwei Parteien analysieren möchte, dh die Bandbreitenschätzung. –