9

やりたい

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()); 
        }
    }
}

何を与える?

ちなみに、一般的な考え方は次のとおりです。

  1. tcpclient マネージャーを作成します。
  2. udpclient を使用してデータの送受信を開始します。
  3. すべてのデータが送信されると、tcpclient マネージャーは受信者にすべてのデータが送信されたことを通知し、udpclient 接続を閉じる必要があります。
4

5 に答える 5

4

ループで使用するべきではないと思いますが、BeginReceive コールバックが呼び出されるたびにもう一度 BeginReceive を呼び出し、数を 100 に制限する場合は count のパブリック変数を保持します。

于 2010-11-07T14:51:42.973 に答える
3

最初にMSDNを見てください。彼らは良い例を提供します。 http://msdn.microsoft.com/en-us/library/system.net.sockets.udpclient.beginreceive.aspx

于 2010-11-07T14:52:32.210 に答える
2

アプリケーションで他のものをブロックしないように、バックグラウンド スレッドでネットワーク通信を行います。

BeginReceive の問題は、ある時点で EndReceive を呼び出す必要があることです (そうしないと、待機ハンドルがただ座っているだけです)。EndReceive の呼び出しは、受信が完了するまでブロックされます。これが、通信を別のスレッドに置く方が簡単な理由です。

于 2010-11-07T14:54:37.937 に答える