Пример #1
0
        /// <summary>
        /// Handle incoming TCP packets according to current connection status.
        /// </summary>
        /// <param name="packet">Packet to receive.</param>
        /// <exception cref="OverflowException">Thrown on fatal error (contact support).</exception>
        /// <exception cref="Sys.IO.IOException">Thrown on IO error.</exception>
        internal void ReceiveData(TCPPacket packet)
        {
            Global.mDebugger.Send("[" + table[(int)Status] + "] " + packet.ToString());

            switch (Status)
            {
            case Status.LISTEN:
                ProcessListen(packet);
                break;

            case Status.SYN_SENT:
                ProcessSynSent(packet);
                break;

            case Status.SYN_RECEIVED:
                ProcessSynReceived(packet);
                break;

            case Status.ESTABLISHED:
                ProcessEstablished(packet);
                break;

            case Status.FIN_WAIT1:
                ProcessFinWait1(packet);
                break;

            case Status.FIN_WAIT2:
                ProcessFinWait2(packet);
                break;

            case Status.CLOSE_WAIT:
                ProcessCloseWait(packet);
                break;

            case Status.CLOSING:
                ProcessClosing(packet);
                break;

            case Status.LAST_ACK:
                ProcessCloseWait(packet);
                break;

            case Status.TIME_WAIT:
                break;

            case Status.CLOSED:
                break;

            default:
                throw new Exception("Unknown TCP connection state.");
            }
        }
Пример #2
0
        /// <summary>
        /// Handle incoming TCP packets according to current connection status.
        /// </summary>
        /// <param name="packet">Packet to receive.</param>
        /// <exception cref="OverflowException">Thrown on fatal error (contact support).</exception>
        /// <exception cref="Sys.IO.IOException">Thrown on IO error.</exception>
        internal void ReceiveData(TCPPacket packet)
        {
            Global.mDebugger.Send("[" + table[(int)Status] + "] " + packet.ToString());

            if (Status == Status.CLOSED)
            {
                //DO NOTHING
            }
            else if (Status == Status.LISTEN)
            {
                ProcessListen(packet);
            }
            else if (Status == Status.SYN_SENT)
            {
                ProcessSynSent(packet);
            }
            else
            {
                // Check sequence number and segment data.
                if (TCB.RcvNxt <= packet.SequenceNumber && packet.SequenceNumber + packet.TCP_DataLength < TCB.RcvNxt + TCB.RcvWnd)
                {
                    switch (Status)
                    {
                    case Status.SYN_RECEIVED:
                        ProcessSynReceived(packet);
                        break;

                    case Status.ESTABLISHED:
                        ProcessEstablished(packet);
                        break;

                    case Status.FIN_WAIT1:
                        ProcessFinWait1(packet);
                        break;

                    case Status.FIN_WAIT2:
                        ProcessFinWait2(packet);
                        break;

                    case Status.CLOSE_WAIT:
                        ProcessCloseWait(packet);
                        break;

                    case Status.CLOSING:
                        ProcessClosing(packet);
                        break;

                    case Status.LAST_ACK:
                        ProcessCloseWait(packet);
                        break;

                    case Status.TIME_WAIT:
                        break;

                    default:
                        Global.mDebugger.Send("Unknown TCP connection state.");
                        break;
                    }
                }
                else
                {
                    if (!packet.RST)
                    {
                        SendEmptyPacket(Flags.ACK);
                    }

                    Global.mDebugger.Send("Sequence number or segment data invalid, packet passed.");
                }
            }
        }