我的问题适用于这段代码:
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/端口创建另一个套接字和线程。
我认为这是一个很好的解决方案,或者至少是一个解决方案的开始,但我仍然想知道一些事情。
- 如何启动添加的线程?我不能等待所有线程完成,然后调用 worker.RunWorkerAsync(); 再次。如果我这样做,很多信息可能会丢失,所以这是没有选择的。
- 因为“尝试”将在所有线程中失败,所以将为单个套接字创建大量线程。我该如何解决?
另外,如果我的想法完全错了,我会很高兴听到。
提前致谢!