⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpsegment.java

📁 SMC takes a state machine stored in a .sm file and generates a State pattern in twelve programming l
💻 JAVA
字号:
//// The contents of this file are subject to the Mozilla Public// License Version 1.1 (the "License"); you may not use this file// except in compliance with the License. You may obtain a copy// of the License at http://www.mozilla.org/MPL/// // Software distributed under the License is distributed on an// "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or// implied. See the License for the specific language governing// rights and limitations under the License.// // The Original Code is State Machine Compiler (SMC).// // The Initial Developer of the Original Code is Charles W. Rapp.// Portions created by Charles W. Rapp are// Copyright (C) 2000 - 2007. Charles W. Rapp.// All Rights Reserved.// // Contributor(s): //// Name//  TcpSegment.java//// Description//  This class encapsulates transmitted TCP data.//// RCS ID// $Id: TcpSegment.java,v 1.5 2007/12/28 12:34:40 cwrapp Exp $//// CHANGE LOG// $Log: TcpSegment.java,v $// Revision 1.5  2007/12/28 12:34:40  cwrapp// Version 5.0.1 check-in.//// Revision 1.4  2005/05/28 13:51:24  cwrapp// Update Java examples 1 - 7.//// Revision 1.0  2003/12/14 20:20:59  charlesr// Initial revision//package smc_ex6;import java.net.DatagramPacket;import java.net.InetAddress;import java.net.UnknownHostException;public final class TcpSegment{// Member methods.    public TcpSegment(int source_port,                      InetAddress destination_address,                      int destination_port,                      int sequence_number,                      int ack_number,                      int flags,                      byte[] data,                      int offset,                      int size)    {        try        {            _src_address = InetAddress.getLocalHost();        }        catch (UnknownHostException hex)        {}        _src_port = source_port;        _dest_address = destination_address;        _dest_port = destination_port;        _sequence_number = sequence_number;        _ack_number = ack_number;        _flags = flags & FLAG_MASK;        // Copy in the data.        if (data == null || data.length == 0)        {            _data = null;            _data_size = 0;        }        else        {            _data = new byte[size];            _data_size = size;            System.arraycopy(data, offset, _data, 0, size);        }        return;    }    /* package */ TcpSegment(DatagramPacket packet)    {        byte[] segment = packet.getData();        _src_address = packet.getAddress();        try        {            _dest_address = InetAddress.getLocalHost();        }        catch (UnknownHostException hex)        {}        _src_port        = ((((int)  segment[0]) & 0x000000ff) <<  8) |                            (((int)  segment[1]) & 0x000000ff);        _dest_port       = ((((int)  segment[2]) & 0x000000ff) <<  8) |                            (((int)  segment[3]) & 0x000000ff);        _sequence_number = ((((int)  segment[4]) & 0x000000ff) << 24) |                           ((((int)  segment[5]) & 0x000000ff) << 16) |                           ((((int)  segment[6]) & 0x000000ff) <<  8) |                            (((int)  segment[7]) & 0x000000ff);        _ack_number      = ((((int)  segment[8]) & 0x000000ff) << 24) |                           ((((int)  segment[9]) & 0x000000ff) << 16) |                           ((((int) segment[10]) & 0x000000ff) <<  8) |                            (((int) segment[11]) & 0x000000ff);        _flags           = ((((int) segment[12]) & 0x000000ff) <<  8) |                            (((int) segment[13]) & 0x000000ff);        _data_size       = ((((int) segment[14]) & 0x000000ff) <<  8) |                            (((int) segment[15]) & 0x000000ff);        if (_data_size == 0)        {            _data = null;        }        else        {            _data = new byte[_data_size];            System.arraycopy(segment,                             TCP_HEADER_SIZE,                             _data,                             0,                             _data_size);        }        return;    }    /* package */ InetAddress getSourceAddress()    {        return(_src_address);    }    /* package */ int getSourcePort()    {        return(_src_port);    }    /* package */ void setSourcePort(int port)    {        _src_port = port;        return;    }    /* package */ InetAddress getDestinationAddress()    {        return(_dest_address);    }    /* package */ int getDestinationPort()    {        return(_dest_port);    }    /* package */ int getSequenceNumber()    {        return(_sequence_number);    }    /* package */ int getAcknowledgeNumber()    {        return(_ack_number);    }    /* package */ int getFlags()    {        return(_flags);    }    /* package */ int getDataSize()    {        return(_data_size);    }    /* package */ byte[] getData()    {        return(_data);    }    /* package */ DatagramPacket packetize()    {        int segment_size;        byte[] segment;        DatagramPacket retval;        // The segment's size is: TCP header size + data size        // (options are not supported).        segment_size = TCP_HEADER_SIZE + _data_size;        segment = new byte[segment_size];        segment[0]  = (byte) ((_src_port & 0x0000ff00) >> 8);        segment[1]  = (byte) (_src_port & 0x000000ff);        segment[2]  = (byte) ((_dest_port & 0x0000ff00) >> 8);        segment[3]  = (byte) (_dest_port & 0x000000ff);        segment[4]  = (byte) (_sequence_number >> 24);        segment[5]  = (byte) ((_sequence_number & 0x00ff0000) >> 16);        segment[6]  = (byte) ((_sequence_number & 0x0000ff00) >> 8);        segment[7]  = (byte) (_sequence_number & 0x000000ff);        segment[8]  = (byte) (_ack_number >> 24);        segment[9]  = (byte) ((_ack_number & 0x00ff0000) >> 16);        segment[10] = (byte) ((_ack_number & 0x0000ff00) >> 8);        segment[11] = (byte) (_ack_number & 0x000000ff);        segment[12] = (byte) (_flags >> 8);        segment[13] = (byte) (_flags & 0x000000ff);        segment[14] = (byte) (_data_size >> 8);        segment[15] = (byte) (_data_size & 0x000000ff);        // Copy in the data, if there is any.        if (_data_size > 0)        {            System.arraycopy(_data,                             0,                             segment,                             TCP_HEADER_SIZE,                             _data_size);        }        retval = new DatagramPacket(segment,                                    segment_size,                                    _dest_address,                                    _dest_port);        return(retval);    }    public String toString()    {        String data_string;        String retval;        if (_data_size == 0)        {            data_string = "";        }        else        {            data_string = new String(_data);        }        retval = "\tSource       : " +                _src_address +                ":" +                Integer.toString(_src_port) +                "\n\tDestination  : " +                _dest_address +                ":" +                Integer.toString(_dest_port) +                "\n\tSequence #   : " +                Integer.toString(_sequence_number) +                "\n\tAcknowledge #: " +                Integer.toString(_ack_number) +                "\n\tFlags        : " +                flagsToString(_flags) +                "\n\tData size    : " +                Integer.toString(_data_size) +                "\n\tData         : \"" +                data_string +                "\"";        return(retval);    }    /* package */ static String flagsToString(int flags)    {        String separator = "{";        String retval = "";        if ((flags & FIN) == FIN)        {            retval += separator + "FIN";            separator = ", ";        }        if ((flags & SYN) == SYN)        {            retval += separator + "SYN";            separator = ", ";        }        if ((flags & RST) == RST)        {            retval += separator + "RST";            separator = ", ";        }        if ((flags & PSH) == PSH)        {            retval += separator + "PSH";            separator = ", ";        }        if ((flags & ACK) == ACK)        {            retval += separator + "ACK";            separator = ", ";        }        if ((flags & URG) == URG)        {            retval += separator + "URG";            separator = ", ";        }        retval += "}";        return(retval);    }// Member data    /* package */ InetAddress _src_address;    /* package */ int _src_port;    /* package */ InetAddress _dest_address;    /* package */ int _dest_port;    /* package */ int _sequence_number;    /* package */ int _ack_number;    /* package */ int _flags;    /* package */ byte[] _data;    /* package */ int _data_size;    // TCP header flags.    public static final int FIN = 0x01;    public static final int SYN = 0x02;    public static final int RST = 0x04;    public static final int PSH = 0x08;    public static final int ACK = 0x10;    public static final int URG = 0x20;    public static final int FIN_ACK = (FIN | ACK);    public static final int SYN_ACK = (SYN | ACK);    public static final int RST_ACK = (RST | ACK);    public static final int PSH_ACK = (PSH | ACK);    public static final int FLAG_MASK =        (FIN | SYN | RST | PSH | ACK | URG);        // Use this static byte array to store a generic        // TCP header. Copy and modify for TCP transmissions.    /* package */ static final int TCP_HEADER_SIZE = 16;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -