public TCPDataEventArgs(TCPDataRecombine tcpData) { TCPData = tcpData; }
public TCPDataEventArgs() { TCPData = null; }
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); }