使用UdpClient.BeginReceive我想這樣做如何在循環
for (int i = 0; i < 100; i++)
{
Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);
}
,但使用的UdpClient.Receive
,我必須使用UdpClient.BeginReceive
。問題是,我該怎麼做?沒有太多使用BeginReceive
的示例,而MSDN示例根本沒有幫助。我應該使用BeginReceive
,還是在單獨的線程下創建它?
我一直得到ObjectDisposedException
例外。我只收到第一批數據。接下來的數據會拋出異常。
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());
}
}
}
什麼給?
順便說,總體思路是:
- 創建TcpClient的經理。
- 開始使用udpclient發送/接收數據。
- 當所有的數據都發送完畢後,tcpclient管理器會通知接收器所有的數據已經發送,並且應該關閉udpclient連接。
您知道當然是UDP是可鬆包,並且不保證唯一性,也爲了一個協議,所以試圖從特定端點收到100個數據包並不一定手段你收到相同的100個數據包,按順序發送?也許你應該使用TCP? – 2010-11-07 16:49:51
我完全意識到這一點。原因是因爲我想分析兩方之間的連接,即帶寬估計。 – 2010-11-07 18:05:47