Esempio n. 1
0
        /// <summary>
        /// 阻塞的方式处理控制器的消息,处理完之前无法接受控制器消息,属于监听子线程
        /// </summary>
        /// <param name="packetInfo"></param>
        public static void DealControllerPacket(PacketInfo packetInfo)
        {
            int iPhyPortNo = packetInfo.GetPhyPort();

            byte[]       buffer  = packetInfo.GetPacketByte();
            PacketEntity packet  = (PacketEntity)Util.BytesToObject(buffer);
            string       content = packet.GetStrContent();
            string       srcIP   = packet.GetHead().strSrcIP;
            string       desIP   = packet.GetHead().strDesIP;

            PacketHead.EN_PACKET_TYPE packetType = packet.GetHead().enPacketType;

            switch (packetType)
            {
            case PacketHead.EN_PACKET_TYPE.EN_ACK_SWITCH_ONLINE:
                Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "控制器上线");
                break;

            //收到控制器下发的流表
            case PacketHead.EN_PACKET_TYPE.EN_PACKET_OUT_WITH_FLOW_ITEM:
                DealPacketOut(packetInfo);
                break;

            case PacketHead.EN_PACKET_TYPE.EN_PACKET_OUT_DUMP:
                //TODO
                break;

            default:
                break;
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 转发常规数据包
        /// </summary>
        /// <param name="packetInfo"></param>
        /// <returns></returns>
        public static void TranNormalPacket(PacketInfo packetInfo)
        {
            byte[]       packetByte   = packetInfo.GetPacketByte();
            PacketEntity packetEntity = (PacketEntity)Util.BytesToObject(packetByte);
            string       srcIP        = packetEntity.GetHead().strSrcIP;
            string       desIP        = packetEntity.GetHead().strDesIP;

            Const.EN_RET_CODE retVal = Const.EN_RET_CODE.EN_RET_INIT;
            int tranPort             = Const.INVALID_NUM;

            //流表中存在转发选项,直接转发
            if (FlowTable.GetInstance().TryGetItem(desIP, out tranPort))
            {
                retVal = Transmitter.SendViaPhyPort(tranPort, packetByte);
                if (Const.EN_RET_CODE.EN_RET_SUCC != retVal)
                {
                    Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "数据包转发失败");
                }
            }
            //流表中不存在转发选项,将数据包暂存缓冲区,上报控制器
            else
            {
                Program.BufferQueue.Enqueue(packetInfo);
                PacketHead   head     = new PacketHead(srcIP, desIP, PacketHead.EN_PACKET_TYPE.EN_PACKET_IN);
                PacketEntity packetIn = new PacketEntity(head, "");
                retVal = Transmitter.SendViaPhyPort(0, Util.ObjectToBytes(packetIn));
                if (retVal != Const.EN_RET_CODE.EN_RET_SUCC)
                {
                    Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "packet_in发送失败");
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 交换机程序启动
        /// </summary>
        public static void Start()
        {
            ////测试
            //if (Program.iCurSwitchID == 0)
            //{
            //	int temp = 0;
            //	while (++temp < 10)
            //	{
            //		PacketEntity packet = new PacketEntity(new PacketHead("1.1.1.1", "2.2.2.2", PacketHead.EN_PACKET_TYPE.EN_NORMAL_PACKET), "Lancer");
            //		byte[] buffer = Util.ObjectToBytes(packet);
            //		Transmitter.SendViaPhyPort(1, buffer);
            //		Transmitter.SendViaPhyPort(2, buffer);
            //		Transmitter.SendViaPhyPort(0, buffer);
            //		Console.WriteLine("发送完成");
            //		Thread.Sleep(1000);
            //	}
            //}



            PacketInfo packetInfo = null;
            bool       firstLoop  = true;

            Const.EN_RET_CODE retVal = Const.EN_RET_CODE.EN_RET_INIT;
            while (true)
            {
                if (firstLoop)
                {
                    //发送初始化完成信息给控制器
                    PacketHead   head   = new PacketHead("", "", PacketHead.EN_PACKET_TYPE.EN_SWITCH_ONLINE);
                    PacketEntity packet = new PacketEntity(head, "");
                    retVal = Transmitter.SendViaPhyPort(0, Util.ObjectToBytes(packet));
                    if (Const.EN_RET_CODE.EN_RET_SUCC != retVal)
                    {
                        //TODO
                        Util.Log(Util.EN_LOG_LEVEL.EN_LOG_FATAL, "初始化完成信息发送失败");
                    }
                    firstLoop = false;
                }

                packetInfo = null;

                //P操作
                Program.PktQueueMutex.WaitOne();
                //消息队列为空,进行V操作之后继续循环读队列
                if (Program.PacketQueue.Count == 0)
                {
                    Program.PktQueueMutex.ReleaseMutex();
                    continue;
                }
                //消息队列不为空,消息包出队后进行V操作
                packetInfo = Program.PacketQueue.Dequeue();
                Program.PktQueueMutex.ReleaseMutex();

                //处理接收到的消息
                DealReceivePacket(packetInfo);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 处理控制器下发的Pakcet_Out消息,监听子线程调用
        /// </summary>
        /// <param name="packetInfo"></param>
        public static void DealPacketOut(PacketInfo packetInfo)
        {
            Console.WriteLine("packet_out");
            byte[]       buffer = packetInfo.GetPacketByte();
            PacketEntity packet = (PacketEntity)Util.BytesToObject(buffer);

            byte[] FlowBuffer = packet.GetByteContent();
            Dictionary <string, int> dictionary = (Dictionary <string, int>)Util.BytesToObject(FlowBuffer);

            for (int i = 0; i < dictionary.Count; i++)
            {
                //Console.WriteLine(dictionary.ElementAt(i).Key + "  " + dictionary.ElementAt(i).Value);
                FlowTableItem fItem = new FlowTableItem(dictionary.ElementAt(i).Key, dictionary.ElementAt(i).Value);
                FlowTable.GetInstance().AddItem(fItem);
            }
            FlowTable.PrintItems();
        }
Esempio n. 5
0
        public void GetAllPacket(CustomerClient p)
        {
            Console.WriteLine("Start Gettting packet");
            List <PacketEntity> packetlist = new List <PacketEntity>();
            string endpoint = p.PacketListAddress;

            try
            {
                string _constr = ConfigurationManager.AppSettings["con"];
                //OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\iAS\TimeWatch.mdb;Jet OLEDB:Database Password=SSS;");
                OleDbConnection con = new OleDbConnection(_constr);
                con.Open();
                string       _querystr = "Select * from MachineRawPunch";
                OleDbCommand cmd       = new OleDbCommand(_querystr, con);
                int          _cntr     = 1;
                using (OleDbDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        PacketEntity _packet = new PacketEntity()
                        {
                            Id = _cntr, student_biometricid = Convert.ToString(reader["CARDNO"]), student_RFId = Convert.ToString(reader["CARDNO"]), Punchdatetime = Convert.ToDateTime(reader["OFFICEPUNCH"]), student_cardnumber = Convert.ToString(reader["CARDNO"]), student_paycode = Convert.ToString(reader["PAYCODE"]), Customercode = ConfigurationManager.AppSettings["Customercode"], Macaddress = GetMacAddress().ToString(), Ipaddress = Dns.GetHostByName(Dns.GetHostName()).AddressList[0].ToString()
                        };
                        packetlist.Add(_packet);
                    }
                    ;

                    _cntr++;
                }
                //  Log.Debug(string.Format("Record fetched from customer end {0}", packetlist.Count()));
                string output   = JsonConvert.SerializeObject(packetlist);
                var    client   = new RestClient(endpoint: endpoint, method: HttpVerb.POST, postData: output);
                string jsondata = client.MakeRequest(p.Authorization, p.AuthorizationPWD);
                //Log.Debug(string.Format("successfull insert till id {0}", jsondata));
                int serverid;
                int.TryParse(jsondata, out serverid);
                Console.WriteLine("Fetch data packed");
            }
            catch (Exception ex)
            {
                // Log.Error(string.Format("exception on get all packet at client side {0}", ex.ToString()));
            }
        }
Esempio n. 6
0
        /// <summary>
        /// 处理命令字符串
        /// </summary>
        /// <param name="cmdStr"></param>
        /// <returns></returns>
        public static Const.EN_RET_CODE DealCommandStr(string cmdStr)
        {
            //分割命令
            string[] cmdArry = System.Text.RegularExpressions.Regex.Split(cmdStr, @"[ ]+");
            //foreach (string i in cmdStrArry)
            //{
            //	Console.WriteLine(i);
            //}

            switch (cmdArry[0])
            {
            case "send":
                //命令参数个数不正确
                if (cmdArry.Length != 3)
                {
                    Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "命令参数个数不正确");
                    return(Const.EN_RET_CODE.EN_RET_CMD_PARA_INVALID);
                }

                try
                {
                    IPAddress.Parse(cmdArry[1]);
                }
                catch (Exception)
                {
                    Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "不是有效的IP地址");
                    return(Const.EN_RET_CODE.EN_RET_CMD_IP_INVALID);
                }
                PacketHead   packetHead   = new PacketHead(Program.strCurHostIP, cmdArry[1], PacketHead.EN_PACKET_TYPE.EN_NORMAL_PACKET);
                PacketEntity packetEntity = new PacketEntity(packetHead, cmdArry[2]);
                Transmitter.Send(Util.ObjectToBytes(packetEntity));
                break;

            //命令不正确
            default:
                Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "无效命令" + "\"" + cmdArry[0] + "\"");
                return(Const.EN_RET_CODE.EN_RET_CMD_INVALID);
            }

            return(Const.EN_RET_CODE.EN_RET_SUCC);
        }
Esempio n. 7
0
        /// <summary>
        /// 处理消息队列中的消息
        /// </summary>
        /// <param name="packetInfo">待处理的消息包</param>
        public static void DealReceivePacket(PacketInfo packetInfo)
        {
            int iPhyPortNo = packetInfo.GetPhyPort();

            byte[]       buffer = packetInfo.GetPacketByte();
            PacketEntity packet = (PacketEntity)Util.BytesToObject(buffer);

            PacketHead.EN_PACKET_TYPE packetType = packet.GetHead().enPacketType;

            switch (packetType)
            {
            case PacketHead.EN_PACKET_TYPE.EN_NORMAL_PACKET:
                TranNormalPacket(packetInfo);
                break;

            default:
                break;
            }

            //Console.WriteLine("从端口" + iPhyPortNo + "收到消息:" + content);
            //Console.WriteLine("SrcIP: " + srcIP + "\tDesIP" + desIP);
        }
Esempio n. 8
0
        /// <summary>
        /// 处理交换机上线消息
        /// </summary>
        /// <param name=""></param>
        public static void DealSwitchOnlinePacket(PacketInfo packetInfo)
        {
            byte[]       packetByte = packetInfo.GetPacketByte();
            int          iPhyPortNo = packetInfo.GetPhyPort();
            PacketEntity packet     = (PacketEntity)Util.BytesToObject(packetByte);
            string       content    = packet.GetStrContent();
            string       srcIP      = packet.GetHead().strSrcIP;
            string       desIP      = packet.GetHead().strDesIP;

            Const.EN_RET_CODE retVal = Const.EN_RET_CODE.EN_RET_INIT;

            Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "交换机" + iPhyPortNo + "上线");

            //回复上线消息
            PacketHead   head      = new PacketHead("", "", PacketHead.EN_PACKET_TYPE.EN_ACK_SWITCH_ONLINE);
            PacketEntity ackPakcet = new PacketEntity(head, "");

            retVal = Transmitter.SendViaPhyPort(iPhyPortNo, Util.ObjectToBytes(ackPakcet));
            if (Const.EN_RET_CODE.EN_RET_SUCC != retVal)
            {
                Util.Log(Util.EN_LOG_LEVEL.EN_LOG_FATAL, "交换机上线ACK发送失败");
            }
        }
Esempio n. 9
0
        /// <summary>
        /// 处理接收到的消息的函数
        /// </summary>
        /// <param name="packetInfo">待处理的消息</param>
        public static void DealReceivePacket(PacketInfo packetInfo)
        {
            byte[]       buffer = packetInfo.GetPacketByte();
            PacketEntity packet = (PacketEntity)Util.BytesToObject(buffer);

            PacketHead.EN_PACKET_TYPE packetType = packet.GetHead().enPacketType;
            //Console.WriteLine("从端口" + iPhyPortNo + "收到消息:" + content);
            //Console.WriteLine("SrcIP: " + srcIP + "\tDesIP: " + desIP);

            switch (packetType)
            {
            case PacketHead.EN_PACKET_TYPE.EN_SWITCH_ONLINE:
                DealSwitchOnlinePacket(packetInfo);
                break;

            case PacketHead.EN_PACKET_TYPE.EN_PACKET_IN:
                DealPakcetIn(packetInfo);
                break;

            default:
                break;
            }
        }
Esempio n. 10
0
        /// <summary>
        /// 处理packet_in消息,计算最短路径后,发送packet_out消息
        /// </summary>
        /// <param name="packetInfo"></param>
        public static void DealPakcetIn(PacketInfo packetInfo)
        {
            byte[]       packetByte = packetInfo.GetPacketByte();
            int          iPhyPortNo = packetInfo.GetPhyPort();
            PacketEntity packet     = (PacketEntity)Util.BytesToObject(packetByte);
            string       content    = packet.GetStrContent();
            string       srcIP      = packet.GetHead().strSrcIP;
            string       desIP      = packet.GetHead().strDesIP;

            Const.EN_RET_CODE retVal = Const.EN_RET_CODE.EN_RET_INIT;

            //Console.WriteLine("switch No : " + iPhyPortNo + "srcIP :" + srcIP + " desIP : " + desIP);

            //源点交换机ID
            int srcSwitchID = iPhyPortNo;

            //目的点交换机ID
            int desSwitchID;

            //目的IP有效标志
            //bool isDesIPValid = true;

            //记录到当前点的最短路径数值
            int[] distance = new int[Program.iMaxDeviceID + 1];

            //标记是否在最短路径中
            bool[] isInPath = new bool[Program.iMaxDeviceID + 1];

            //最短路径的前驱点
            int[] preSwitchID = new int[Program.iMaxDeviceID + 1];

            //获取目的节点的ID
            try
            {
                desSwitchID = GetSwitchIDByIP(desIP);
            }
            catch (Exception)
            {
                //如果目的IP不在拓扑图中,则命令交换机丢弃数据包
                Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, "目的IP错误");
                PacketHead   dumpHead   = new PacketHead(srcIP, desIP, PacketHead.EN_PACKET_TYPE.EN_PACKET_OUT_DUMP);
                PacketEntity dumpPacket = new PacketEntity(dumpHead, "");
                retVal = Transmitter.SendViaPhyPort(srcSwitchID, Util.ObjectToBytes(dumpPacket));
                return;
            }

            //初始化数组
            for (int i = 0; i < Program.iMaxDeviceID + 1; i++)
            {
                //设置标记为false,即未计算出到i的最短路
                isInPath[i] = false;

                //初始化为最大值加一
                distance[i] = Const.MAX_DISTANCE + 1;

                //前驱点设置为无效点
                preSwitchID[i] = Const.INVALID_NUM;

                //自己到自己的路径长度设为0
                if (i == srcSwitchID)
                {
                    distance[i] = 0;
                    isInPath[i] = true;
                }

                //两个交换机之间有相连路径
                if (Program.PathInfoArr[srcSwitchID, i].distance != Const.INVALID_NUM)
                {
                    distance[i] = Program.PathInfoArr[srcSwitchID, i].distance;

                    //前驱暂时设置为源点
                    preSwitchID[i] = srcSwitchID;
                }
            }

            //循环n - 1次
            for (int loop = 0; loop < Program.iMaxDeviceID; loop++)
            {
                int minDis       = Const.MAX_DISTANCE + 1;
                int nextSwitchID = Const.INVALID_NUM;

                //找距离最小的点
                for (int i = 0; i < Program.iMaxDeviceID + 1; i++)
                {
                    if (!isInPath[i])
                    {
                        if (distance[i] < minDis)
                        {
                            minDis       = distance[i];
                            nextSwitchID = i;
                        }
                    }
                }

                //Console.WriteLine("next : " + nextSwitchID);
                //将距离最小的点加入路径
                isInPath[nextSwitchID] = true;

                //更新数组
                for (int i = 0; i < Program.iMaxDeviceID + 1; i++)
                {
                    if (!isInPath[i] && (Program.PathInfoArr[nextSwitchID, i].distance != Const.INVALID_NUM))
                    {
                        if (minDis + Program.PathInfoArr[nextSwitchID, i].distance < distance[i])
                        {
                            distance[i]    = minDis + Program.PathInfoArr[nextSwitchID, i].distance;
                            preSwitchID[i] = nextSwitchID;
                        }
                    }
                }

                //如果已经找到目的交换机,则退出循环
                if (nextSwitchID == desSwitchID)
                {
                    break;
                }
            }

            //for (int i = 0; i < Program.iMaxSwitchID + 1; i++)
            //{
            //	Console.Write(preSwitchID[i] + "\t");
            //}
            //Console.Write("\n");

            Dictionary <string, int> FlowTableDic = new Dictionary <string, int>();

            //遍历找到最短路的终点
            for (int i = 0; i < Program.iMaxDeviceID + 1; i++)
            {
                if (!isInPath[i])
                {
                    continue;
                }
                if (i == srcSwitchID)
                {
                    continue;
                }

                //TODO
                int curID = i;
                int preID = preSwitchID[curID];

                //Console.WriteLine("Path: ");
                while (preSwitchID[preID] != Const.INVALID_NUM)
                {
                    //Console.WriteLine(curID);
                    curID = preID;
                    preID = preSwitchID[curID];
                }
                //此时curID是下一跳的交换机
                //Console.WriteLine(curID);
                int transPort = Program.PathInfoArr[srcSwitchID, curID].phyPortNo;

                FlowTableDic.Add(GetSwitchIPByID(i), transPort);
            }

            for (int i = 0; i < FlowTableDic.Count; i++)
            {
                Console.Write(FlowTableDic.ElementAt(i).Key + "\t");
                Console.Write(FlowTableDic.ElementAt(i).Value);
                Console.Write("\n");
            }

            PacketHead head = new PacketHead(srcIP, desIP, PacketHead.EN_PACKET_TYPE.EN_PACKET_OUT_WITH_FLOW_ITEM);

            byte[]       dicByte   = Util.ObjectToBytes(FlowTableDic);
            PacketEntity packetOut = new PacketEntity(head, dicByte);

            //PacketEntity packetOut = new PacketEntity(head, Encoding.Default.GetBytes("asdf"));
            retVal = Transmitter.SendViaPhyPort(srcSwitchID, Util.ObjectToBytes(packetOut));
            if (retVal != Const.EN_RET_CODE.EN_RET_SUCC)
            {
                Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, srcSwitchID + "号交换机路径请求发送失败");
                return;
            }
            Util.Log(Util.EN_LOG_LEVEL.EN_LOG_INFO, srcSwitchID + "号交换机路径请求发送成功");
            //Console.WriteLine("distance: ");
            //for (int i = 0; i < Program.iMaxSwitchID + 1; i++)
            //{
            //	Console.Write(distance[i] + "\t");
            //}
            //Console.Write("\n");
        }