public void Stop() { var serverToStop = MessageServersQueue.Dequeue(); MessageServers.Remove(serverToStop); serverToStop.Stop(); serverToStop.ReceiveEvent -= ServerReceiveEvent; }
internal void Start() { var newServer = new MessageServer(555, 1024); MessageServers.Add(newServer); MessageServersQueue.Enqueue(newServer); newServer.ReceiveEvent += ServerReceiveEvent; newServer.Start(); }
private static void device_OnPacketArrival(object sender, CaptureEventArgs e) { var time = e.Packet.Timeval.Date; var len = e.Packet.Data.Length; var packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var tcpPacket = packet.Extract <TcpPacket>(); if (tcpPacket != null) { var ipPacket = (IPPacket)tcpPacket.ParentPacket; IPAddress srcIp = ipPacket.SourceAddress; IPAddress dstIp = ipPacket.DestinationAddress; int srcPort = tcpPacket.SourcePort; int dstPort = tcpPacket.DestinationPort; if (!BreakIpAddresses.Contains(srcIp) && !BreakIpAddresses.Contains(dstIp)) { return; } if (!tcpPacket.PayloadData.Any() || tcpPacket.PayloadData.Length < 2) { return; } if (tcpPacket.SequenceNumber.Equals(BeforePacket?.SequenceNumber)) // なんか二回来るので { return; } BeforePacket = tcpPacket; var fromServer = Equals(packet.Extract <EthernetPacket>().DestinationHardwareAddress, LocalPhysicalAddress); var server = ServerTypeEnum.Unknown; var key = LoginKeyIndex; var checkHeader = tcpPacket.PayloadData.Take(6).ToArray(); if (srcIp.Equals(LoginServerIP) || dstIp.Equals(LoginServerIP)) { if (fromServer && srcPort != LoginServerPort || !fromServer && dstPort != LoginServerPort) { return; } var loginHelloHeader = new byte[] { 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00 }; if (checkHeader.SequenceEqual(loginHelloHeader)) { Console.WriteLine(tcpPacket.PayloadData.HexDump()); LoginKeyIndex = tcpPacket.PayloadData[6]; return; } server = ServerTypeEnum.Login; if (!GotLoginKey) { Console.WriteLine("???LoginKey Unknown Skipped???"); return; } } else if (fromServer && GameServers.Select(g => (g.IP, g.Port)).Contains((srcIp, srcPort)) || !fromServer && GameServers.Select(g => (g.IP, g.Port)).Contains((dstIp, dstPort))) { var gameHelloHeader = new byte[] { 0x00, 0x06, 0x00, 0x00, 0x3F, 0x00 }; var gameHelloHeaderTH = new byte[] { 0x00, 0x16, 0x00, 0x00, 0x3F, 0x00 }; if (checkHeader.SequenceEqual(gameHelloHeader) || checkHeader.SequenceEqual(gameHelloHeaderTH)) { Console.WriteLine(tcpPacket.PayloadData.HexDump()); GameKeyIndex = tcpPacket.PayloadData[8]; ConnectingGameServer = GameServers.Single(g => Equals(g.IP, srcIp) && g.Port == srcPort); return; } if (fromServer && !CheckCapture(ConnectingGameServer, srcIp, srcPort) || !fromServer && !CheckCapture(ConnectingGameServer, dstIp, dstPort)) { return; } server = ServerTypeEnum.Game; key = GameKeyIndex; if (!GotGameKey) { Console.WriteLine("???GameKey Unknown Skipped???"); return; } } else if (fromServer && MessageServers.Select(m => (m.IP, m.Port)).Contains((srcIp, srcPort)) || !fromServer && MessageServers.Select(m => (m.IP, m.Port)).Contains((dstIp, dstPort))) { var messageHelloHeader = new byte[] { 0x00, 0x09, 0x00, 0x00, 0x2E, 0x00 }; if (checkHeader.SequenceEqual(messageHelloHeader)) { Console.WriteLine(tcpPacket.PayloadData.HexDump()); MessageKeyIndex = tcpPacket.PayloadData[7]; ConnectingMessageServer = MessageServers.Single(m => Equals(m.IP, srcIp) && m.Port == srcPort); return; } if (tcpPacket.PayloadData.First() == 0) { Console.WriteLine("###Message Hello?###"); Console.WriteLine(tcpPacket.PayloadData.HexDump()); } if (fromServer && !CheckCapture(ConnectingMessageServer, srcIp, srcPort) || !fromServer && !CheckCapture(ConnectingMessageServer, dstIp, dstPort)) { return; } server = ServerTypeEnum.Message; key = MessageKeyIndex; if (!GotMessageKey) { Console.WriteLine("???MessageKey Unknown Skipped???"); return; } }