0

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

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/端口收到消息,“尝试”部分将失败,因此在 catch 中,我为另一个 IP/端口创建另一个套接字和线程。

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

  1. 如何启动添加的线程?我不能等待所有线程完成,然后调用 worker.RunWorkerAsync(); 再次。如果我这样做,很多信息可能会丢失,所以这是没有选择的。
  2. 因为“尝试”将在所有线程中失败,所以将为单个套接字创建大量线程。我该如何解决?

另外,如果我的想法完全错了,我会很高兴听到。

提前致谢!

4

0 回答 0