예제 #1
0
        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.");
        }
예제 #2
0
        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.");
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }