Esempio n. 1
0
 public TCPDataEventArgs(TCPDataRecombine tcpData)
 {
     TCPData = tcpData;
 }
Esempio n. 2
0
 public TCPDataEventArgs()
 {
     TCPData = null;
 }
Esempio n. 3
0
        bool Read()
        {
            IPPacket  ipUp;
            IPPacket  ip;
            TCPPacket tcp;
            bool      bFinish = false;

            ip             = NewIPPacket();
            tcp            = (TCPPacket)ip.oProtocolContent;
            tcp.TCPOptions = new List <byte>();
            tcp.TCPOptions.Add(0x02);//段字节数最多为1024:0x4000
            tcp.TCPOptions.Add(0x04);
            tcp.TCPOptions.Add(0x04);
            tcp.TCPOptions.Add(0x00);
            tcp.DataOffset++;
            tcp.TCPFlags = 0x02;//同步
            IPSender(ip);
            int err   = 0;
            int retry = 0;

            while (true)
            {
                ipUp = IPReader();
                if (ipUp != null)
                {
                    err = 0;
                    TCPPacket tcpUp = (TCPPacket)ipUp.oProtocolContent;
                    if (tcpUp == null)
                    {
                        continue;
                    }
                    if (tcpUp.DastinationPort != ourPort)
                    {
                        continue;
                    }
                    switch (tcpUp.TCPFlags)
                    {
                    case 0x12:
                        if (tcpState == TCPState.SYN)    //之前正在处于请求连接状态
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            tcp.TCPFlags = 0x18;    //push数据
                            TCPSeqNum   += (uint)TCPTxData.Count;
                            foreach (byte b in TCPTxData)
                            {
                                tcp.Datas.Add(b);
                            }
                            IPSender(ip);
                            TCPData            = new TCPDataRecombine(TCPDataType.HTTP);
                            TCPData.InitSeqNum = tcp.AckSeqNumber;
                            tcpState           = TCPState.TransData;
                        }
                        else if (tcpState == TCPState.FIN)
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            ip             = NewIPPacket();
                            tcp            = (TCPPacket)ip.oProtocolContent;
                            tcp.TCPOptions = new List <byte>();
                            tcp.TCPOptions.Add(0x02);    //段字节数最多为1024:0x4000
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x00);
                            tcp.DataOffset++;
                            tcp.TCPFlags = 0x02;    //同步
                            IPSender(ip);
                            tcpState = TCPState.SYN;
                        }
                        else if (tcpState == TCPState.TransData)
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                        }
                        else
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x14;
                            IPSender(ip);
                            ip             = NewIPPacket();
                            tcp            = (TCPPacket)ip.oProtocolContent;
                            tcp.TCPOptions = new List <byte>();
                            tcp.TCPOptions.Add(0x02);    //段字节数最多为1024:0x4000
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x00);
                            tcp.DataOffset++;
                            tcp.TCPFlags = 0x02;    //同步
                            IPSender(ip);
                            Debug.WriteLine(Com.PortName + "TCP未知命令交互:" + tcpState.ToString() + "  " + tcpUp.TCPFlags.ToString("X2"));
                        }
                        break;

                    case 0x10:
                    case 0x18:
                        if (tcpState == TCPState.WaitFIN)
                        {
                            OnIPProcLog("成功关闭连接!", (int)ATCommandLogType.Rx);
                            tcpState = TCPState.WaitFIN1;
                            return(true);
                        }
                        else if (tcpState == TCPState.TransData)
                        {
                            if (tcpUp.Datas.Count != 0)
                            {
                                int rxState = TCPData.bFinish(tcpUp.InitialSeqNumber, tcpUp.Datas, finishper);
                                if (finishper < 100)
                                {
                                    switch (TCPData.datatype)
                                    {
                                    case TCPDataType.HTTP:
                                        Http http = (Http)TCPData.oTCPDatas;
                                        OnIPFinishPer(http.per.ToString());
                                        break;

                                    default:
                                        break;
                                    }
                                }
                                if (rxState == (int)HttpRxState.Finish)  //数据接收完成
                                {
                                    tcp.TCPFlags = 0x11;
                                    TCPSeqNum++;
                                    tcpState = TCPState.WaitFIN;
                                    IPSender(ip);
                                    bFinish = true;
                                    OnIPProcLog("数据接收完成!", (int)ATCommandLogType.Rx);
                                }
                                else if (rxState == (int)HttpRxState.LengthOut)
                                {
                                    ip             = NewIPPacket();
                                    tcp            = (TCPPacket)ip.oProtocolContent;
                                    tcp.TCPOptions = new List <byte>();
                                    tcp.TCPOptions.Add(0x02);    //段字节数最多为1024:0x4000
                                    tcp.TCPOptions.Add(0x04);
                                    tcp.TCPOptions.Add(0x04);
                                    tcp.TCPOptions.Add(0x00);
                                    tcp.DataOffset++;
                                    tcp.TCPFlags = 0x02;    //同步
                                    IPSender(ip);
                                    tcpState = TCPState.SYN;
                                }
                                else
                                {
                                    Debug.WriteLine(Com.PortName + "还需要的数据量为:" + rxState.ToString());
                                    ip  = NewIPPacket();
                                    tcp = (TCPPacket)ip.oProtocolContent;
                                    tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                                    tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + (uint)tcpUp.Datas.Count;
                                    tcp.TCPFlags         = 0x10;
                                    IPSender(ip);
                                }
                            }
                        }
                        else
                        {
//                                 ip = NewIPPacket();
//                                 tcp = (TCPPacket)ip.oProtocolContent;
//                                 tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
//                                 tcp.AckSeqNumber = tcpUp.InitialSeqNumber + 1;
//                                 tcp.TCPFlags = 0x14;
//                                 IPSender(ip);
                            ip             = NewIPPacket();
                            tcp            = (TCPPacket)ip.oProtocolContent;
                            tcp.TCPOptions = new List <byte>();
                            tcp.TCPOptions.Add(0x02);    //段字节数最多为1024:0x4000
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x00);
                            tcp.DataOffset++;
                            tcp.TCPFlags = 0x02;    //同步
                            IPSender(ip);
//                                 Debug.WriteLine(Com.PortName + "TCP未知命令交互:" + tcpState.ToString() + "  " + tcpUp.TCPFlags.ToString("X2"));
                            Debug.WriteLine(Com.PortName + "TCP未知命令交互:" + tcpState.ToString() + "  " + tcpUp.TCPFlags.ToString("X2"));
                        }
                        break;

                    case 0x11:
                        if (tcpState == TCPState.WaitFIN)
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            OnIPProcLog("成功关闭连接!11111111111111111111", (int)ATCommandLogType.Rx);
                            return(true);
                        }
                        else
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            ip             = NewIPPacket();
                            tcp            = (TCPPacket)ip.oProtocolContent;
                            tcp.TCPOptions = new List <byte>();
                            tcp.TCPOptions.Add(0x02);    //段字节数最多为1024:0x4000
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x04);
                            tcp.TCPOptions.Add(0x00);
                            tcp.DataOffset++;
                            tcp.TCPFlags = 0x02;    //同步
                            IPSender(ip);
                            tcpState = TCPState.SYN;
                        }
                        break;

                    case 0x04:
                        if (tcpState == TCPState.WaitFIN || tcpState == TCPState.WaitFIN1)
                        {
//                                 ip = NewIPPacket();
//                                 tcp = (TCPPacket)ip.oProtocolContent;
//                                 tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
//                                 tcp.AckSeqNumber = tcpUp.InitialSeqNumber;
//                                 tcp.TCPFlags = 0x10;
//                                 IPSender(ip);
//                                 tcp.TCPFlags = 0x11;
//                                 TCPSeqNum++;
//                                 tcpState = TCPState.WaitFIN;
//                                 IPSender(ip);
                            OnIPProcLog("彻底关闭连接", (int)ATCommandLogType.Rx);
                            return(true);
                        }
                        else
                        {
                            Debug.WriteLine(Com.PortName + "TCP未知命令交互:" + tcpState.ToString() + "  " + tcpUp.TCPFlags.ToString("X2"));
//                                 if(tcpState==TCPState.SYN)
//                                 {
//                                     ip = NewIPPacket();
//                                     tcp = (TCPPacket)ip.oProtocolContent;
//                                     tcp.TCPOptions = new List<byte>();
//                                     tcp.TCPOptions.Add(0x02);//段字节数最多为1024:0x4000
//                                     tcp.TCPOptions.Add(0x04);
//                                     tcp.TCPOptions.Add(0x04);
//                                     tcp.TCPOptions.Add(0x00);
//                                     tcp.DataOffset++;
//                                     tcp.TCPFlags = 0x02;//同步
//                                     IPSender(ip);
//                                     tcpState = TCPState.SYN;
//                                 }
                        }
                        break;

                    case 0x14:
                        if (tcpState == TCPState.WaitFIN || tcpState == TCPState.WaitFIN1)
                        {
                            OnIPProcLog("彻底关闭连接", (int)ATCommandLogType.Rx);
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            return(true);
                        }
                        else
                        {
                            Debug.WriteLine(Com.PortName + "TCP未知命令交互:" + tcpState.ToString() + "  " + tcpUp.TCPFlags.ToString("X2"));
//                                 if (tcpState == TCPState.SYN)
//                                 {
//                                     ip = NewIPPacket();
//                                     tcp = (TCPPacket)ip.oProtocolContent;
//                                     tcp.TCPOptions = new List<byte>();
//                                     tcp.TCPOptions.Add(0x02);//段字节数最多为1024:0x4000
//                                     tcp.TCPOptions.Add(0x04);
//                                     tcp.TCPOptions.Add(0x04);
//                                     tcp.TCPOptions.Add(0x00);
//                                     tcp.DataOffset++;
//                                     tcp.TCPFlags = 0x02;//同步
//                                     IPSender(ip);
//                                     tcpState = TCPState.SYN;
//                                 }
                            //                                 ip = NewIPPacket();
//                                 tcp = (TCPPacket)ip.oProtocolContent;
//                                 tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
//                                 tcp.AckSeqNumber = tcpUp.InitialSeqNumber;
//                                 tcp.TCPFlags = 0x10;
//                                 IPSender(ip);
//                                 tcpState = TCPState.SYN;
                        }
                        break;

                    case 0x01:
                        if (tcpState == TCPState.WaitFIN1)
                        {
                            ip  = NewIPPacket();
                            tcp = (TCPPacket)ip.oProtocolContent;
                            tcp.InitialSeqNumber = tcpUp.AckSeqNumber;
                            tcp.AckSeqNumber     = tcpUp.InitialSeqNumber + 1;
                            tcp.TCPFlags         = 0x10;
                            IPSender(ip);
                            OnIPProcLog("成功关闭连接!11111111111111111111", (int)ATCommandLogType.Rx);
                            return(true);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else
                {
                    err++;
                    if (err > 30)
                    {
                        if (bFinish)
                        {
                            return(true);
                        }
                        bFinish = false;
                        retry++;
                        if (retry > 12)
                        {
                            break;
                        }
                        OnIPProcLog("TCP超时重试" + (retry + 1).ToString(), (int)ATCommandLogType.TCPTimeOut);
                        err            = 0;
                        ip             = NewIPPacket();
                        tcp            = (TCPPacket)ip.oProtocolContent;
                        tcp.TCPOptions = new List <byte>();
                        tcp.TCPOptions.Add(0x02);//段字节数最多为1024:0x4000
                        tcp.TCPOptions.Add(0x04);
                        tcp.TCPOptions.Add(0x04);
                        tcp.TCPOptions.Add(0x00);
                        tcp.DataOffset++;
                        tcp.TCPFlags = 0x02;//同步
                        IPSender(ip);
                        tcpState = TCPState.SYN;
                    }
                }
            }
            return(false);
        }