我在 .NETMF 应用程序中有一个 UDP 服务器(解决方案可能与经典的 .NET Framework 4.5 类似,只是没有一些类和方法,例如 UdpClient)。我在这样的套接字上“开始监听”:
_server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_server.Bind(ep);
现在我想接受来自多个线程的数据(每个 IPEndPoint 一个线程)。关键是最大化速度。(请注意,我使用的是 .NETMF,因此 UdpClient 类不可用)。
我有两个想法。首先是为每个预期创建一个线程IPEndPoint
并在那里接受/处理数据。然而问题是,在线程接受数据并确定接受的源 IP/端口与分配给该线程的 IP/端口不同之后,该数据被丢弃并且不再可用于其他适当的线程。有没有简单的方法来解决这个问题?在此处查看示例代码:
using System;
using Microsoft.SPOT;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace MFConsoleApplication1
{
internal class ServerThread
{
internal IPEndPoint EP { get; private set; }
internal Socket Server { get; private set; }
public ServerThread(IPEndPoint ep, Socket s)
{
EP = ep;
Server = s;
new Thread(() =>
{
byte[] buffer = new byte[2048];
int byteCount;
EndPoint recvEP = new IPEndPoint(IPAddress.Any, 0);
while (true)
{
byteCount = Server.ReceiveFrom(buffer, ref recvEP);
if (!recvEP.Equals(EP)) cotinue; //this makes the thread to ignore
// to ignore the data as EP is different,but it throw the data away
// Process data
Debug.Print(byteCount.ToString()); // For example
}
}).Start();
}
}
}
另一种想法是让一个线程接受数据。当一个数据块被接受时,根据源 IP/端口,这个线程将创建一个新的线程来处理数据。这种方式似乎不太优雅,因为它需要每秒创建数十或数百个线程。一点改进可能是为每个预期的 IPEndPoint 创建线程,并将它们保持在挂起状态,直到特定 End Point 的数据可用。
请问这个问题的解决方法是什么?
感谢您的任何努力。
更新 自然的方法是:
_server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
_server.Bind(ep);
while (true)
{
byteCount = Server.ReceiveFrom(buffer, ref recvEP);
// Process data
Debug.Print(byteCount.ToString()); // For example
}
但是我需要根据发件人的地址处理数据。所以我也许可以添加一条具有类似含义的行,例如:
new Thread(new ParameterizedThreadStart(ProcessData)).Start(recvEP);
并在每次收到一些数据后执行它,但是由于服务器每秒接收数十 - 数百条消息,这也不太优雅。
请为我的问题提出一个最佳解决方案。