我听tcp端口,当我从源ip收到第一个,然后我为这个新的源ip创建一个特殊类的新实例
在来自该源ip的第二个数据包中,我不需要创建一个新的类
实例我的问题是如何将第二个数据包传递给我为该源ip创建的类,特别是虽然我为不同的源创建了许多类ip
如果这是错误的方式,那么最好的方法是什么?
提前致谢
答案 0 :(得分:2)
尝试使用Dictionary
存储IP地址到处理对象的映射。以下代码中的类Session
对应于您的特殊处理类。其他类和属性可能需要更改 - 如果您需要更多细节,请提供一些代码。
private Dictionary<IPAddress,Session> activeSessions = new Dictionary<IPAddress,Session>();
private void packetReceived(Packet pkt)
{
Session curSession;
if (!activeSessions.TryGetValue(pkt.SourceIP, out curSession))
{
curSession = new Session();
activeSessions.Add(pkt.SourceIP, curSession);
}
curSession.ProcessPacket(pkt);
}
答案 1 :(得分:1)
所以你有一些东西在套接字上监听。当数据进入时,您检查源IP。如果是新IP,则实例化一个对象来处理它。继续前进,您希望来自该源IP的所有后续数据包都转到已经实例化的类,对吗?
只需为您的处理类提供SourceIp
等属性即可。在最初接收数据包的类中,创建所有实例化类的数组/列表。当数据包进入时,循环遍历数组并查看是否已经存在实例化对象。
<强>更新强>
我将稍微扩展@ Justin的代码,但我同意Dictionary
可能是最好的类型。假设你有这个处理数据包的类:
class Processor
{
public void ProcessPacket(Byte[] data)
{
//Your processing code here
}
}
你首先需要c 在接收数据的代码中,我假设您既拥有数据本身又拥有源IP。收到数据后,您在字典中查找IP并创建新处理器或重新使用现有处理器:
//Holds our processor classes, each identified by IP
private Dictionary<IPAddress, Processor> Processors = new Dictionary<IPAddress,Processor>();
private void dataReceived(Byte[] data, IPAddress ip)
{
//If we don't already have the IP Address in our dictionary
if(!Processors.ContainsKey(ip)){
//Create a new processor object and add it to the dictionary
Processors.Add(ip, new Processor());
}
//At this point we've either just added a processor for this IP
//or there was one already in the dictionary so grab it based
//on the IP
Processor p = Processors[ip];
//Tell it to process our data
p.ProcessPacket(data);
}