我的问题适用于这段代码:
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 /端口创建另一个套接字和线程。
我认为这是一个很好的解决方案,或者至少是一个解决方案的开头,但我仍然想知道一些事情。
另外,如果我完全想错了方向,我会很高兴听到。
提前致谢!