插座&访问许多具有相同名称的类

时间:2011-01-13 18:37:18

标签: c#

我听tcp端口,当我从源ip收到第一个,然后我为这个新的源ip创建一个特殊类的新实例

在来自该源ip的第二个数据包中,我不需要创建一个新的类

实例

我的问题是如何将第二个数据包传递给我为该源ip创建的类,特别是虽然我为不同的源创建了许多类ip

如果这是错误的方式,那么最好的方法是什么?

提前致谢

2 个答案:

答案 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);
    }