从多个UDP端点接收

时间:2013-05-07 14:25:48

标签: c# udp

我的问题适用于这段代码:

using DSemulator;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace Stuff
{
public class interfaceServer
{
        int portNumber = 8000;
        IPEndPoint ipep, iclient;
        UdpClient clientUdp;
        BackgroundWorker worker = new BackgroundWorker();

        List<UdpClient> clients = new List<UdpClient>();

        public interfaceServer()
        {
                ipep = new IPEndPoint(IPAdress.Any, portNumber);
                iclient = new IPEndPoint(IPAddress.Any, 0);

                clientUdp = new UdpClient();
                clientUdp.ExclusiveAddressUse = false;
                clientUdp.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

                clientUdp.Client.Bind(ipep);

                worker.DoWork += delegate { worker_DoWork(clientUdp, iclient); };
                worker.RunWorkerAsync();
        }

        void worker_DoWork(UdpClient udpClient, IPEndPoint remoteEndpoint)
        {
                bool read = true;
                while (read)
                {
                        Byte[] data_rec = new Byte[128];
                        try
                        {
                                data_rec = udpClient.Receive(ref remoteEndpoint);
                        }
                        catch (SocketException)
                        {
                                IPEndPoint endpoint = new IPEndPoint(IPAddress.Any, 0);
                                UdpClient tempClient = new UdpClient();
                                tempClient.ExclusiveAddressUse = false;
                                tempClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                                tempClient.Client.Bind(endpoint);

                                worker.DoWork += delegate { worker_DoWork(tempClient, endpoint); };
                        }

                        //do interesting stuffzz
                        //the UdpClient and remoteEndpoint need to be passed to objects of another class.
                        //these objects handle sending data back
                }
        }
}
}

由于公司机密,我无法显示整个代码,但这就是我的问题所在。

我有一个程序,简单说必须收到Udp包。这些包可以从任何IP地址和任何端口号发送。也没有办法说明会有多少联系。所有这些连接需要同时处理(同时,对于我们作为人类),我不能等到一个套接字收到一些东西然后转移到另一个接收,这就是我实现线程的原因。 消息将在单个端口上接收,在这种情况下为8000。

在我做的代码中,我创建了一个try-catch语句来接收消息。如果从另一个IP /端口收到消息,'try'部分将失败,因此在catch中我为另一个IP /端口创建另一个套接字和线程。

我认为这是一个很好的解决方案,或者至少是一个解决方案的开头,但我仍然想知道一些事情。

  1. 如何启动添加的帖子?我不能等待所有线程完成,然后调用worker.RunWorkerAsync();再次。如果我这样做,很多信息都会丢失,所以这是没有选择的。
  2. 因为'try'在所有线程中都会失败,所以会为单个套接字创建大量线程。我该如何解决?
  3. 另外,如果我完全想错了方向,我会很高兴听到。

    提前致谢!

0 个答案:

没有答案