public void Connect(string destination, ushort port) { SequenceNumber = (ushort)_client._rnd.Next(0, (int)ushort.MaxValue); AcknowledgementNumber = 0; Destination = destination; DestinationPort = port; OSI.Layer4TcpPacket packet = new OSI.Layer4TcpPacket(); packet.Destination = destination; packet.RemotePort = port; packet.LocalPort = SourcePort; packet.SequenceNumber = SequenceNumber; packet.AcknowledgementNumber = AcknowledgementNumber; packet.SYN = true; State = TcpState.SYN_SENT; _client.SendPacket(packet); DateTime now = DateTime.Now; while ((DateTime.Now - now).TotalSeconds < TIMEOUT) { if (State == TcpState.ESTABLISHED) { return; } System.Threading.Thread.Sleep(25); } throw new Exception("TCP Timeout."); }
public void SendPacket(TcpPacket packet) { try { OSI.Layer4TcpPacket l4 = new OSI.Layer4TcpPacket(); l4.PSH = true; l4.ACK = true; l4.RemotePort = DestinationPort; l4.LocalPort = SourcePort; l4.SequenceNumber = SequenceNumber; l4.AcknowledgementNumber = AcknowledgementNumber; l4.Destination = Destination; int length = 0; foreach (ILayer layer in packet.Layers) { length += layer.Length; l4.NextLayers.Add(layer); } _client.SendPacket(l4); SequenceNumber += (uint)length; } catch (Exception ex) { throw new Exception("No TCP Client is associated with this session."); } }
private void SendAck() { OSI.Layer4TcpPacket l4 = new OSI.Layer4TcpPacket(); l4.ACK = true; l4.RemotePort = DestinationPort; l4.LocalPort = SourcePort; l4.SequenceNumber = SequenceNumber; l4.AcknowledgementNumber = AcknowledgementNumber; l4.Destination = Destination; _client.SendPacket(l4); }
private void SendTcpPacket(OSI.Layer4TcpPacket packet, PacketSentHandler callback) { TcpLayer tcpLayer = new TcpLayer { SourcePort = packet.LocalPort, DestinationPort = packet.RemotePort, Checksum = null, // Will be filled automatically. SequenceNumber = packet.SequenceNumber, AcknowledgmentNumber = packet.AcknowledgementNumber, Window = 64512, }; if (packet.ACK) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Acknowledgment; } if (packet.SYN) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Synchronize; } if (packet.RST) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Reset; } if (packet.PSH) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Push; } if (packet.FIN) { tcpLayer.ControlBits = tcpLayer.ControlBits | TcpControlBits.Fin; } OSI.Layer3Packet l3 = new OSI.Layer3Packet(); l3.Ttl = 255; l3.SourceIP = Configuration.IpAddress; l3.Destination = packet.Destination; foreach (ILayer layer in packet.NextLayers) { l3.NextLayers.Add(layer); } l3.NextLayers.Insert(0, tcpLayer); SendLayer3Packet(l3, callback); }