📄 header.java
字号:
/************************************************************************
* $Id: Header.java,v 1.2 2002/03/04 21:42:57 echtcherbina Exp $
*
* Copyright (c) 2001 Sun Microsystems, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Sun Microsystems, Inc. for Project JXTA."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Sun", "Sun Microsystems, Inc.", "JXTA" and "Project JXTA"
* must not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact Project JXTA at http://www.jxta.org.
*
* 5. Products derived from this software may not be called "JXTA",
* nor may "JXTA" appear in their name, without prior written
* permission of Sun.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL SUN MICROSYSTEMS OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of Project JXTA. For more
* information on Project JXTA, please see
* <http://www.jxta.org/>.
*
* This license is based on the BSD license adopted by the Apache Foundation.
*********************************************************************************/
package net.jxta.impl.endpoint.tcp;
import java.net.*;
import java.io.*;
import java.util.*;
import net.jxta.endpoint.*;
import net.jxta.impl.endpoint.*;
/***
* This class implements the TCP Transport Protocol Header
*
* The format of the header is:
*
* 1 byte: type
* 4 bytes: src IP
* 2 bytes: src port
* 4 bytes: size of packed (beside this header)
* 1 byte: option
* 4 bytes: packet id
* 4 bytes: unused
* Depending on the command, some of the fields may not be used. However,
* the header is fixed: used fields are ignored, but transmitted.
*/
public class Header {
public byte cmd;
public byte[] srcAddr;
public int srcPort;
public int size;
public int option;
public int packetId;
public static int length = 20; // This is bigger than what is needed
// Cmds
public static final int PROPAGATE = 1;
public static final int UNICAST = 2;
/* FIXME: ACK and NACK are stated to be unused in the spec. Is this
* still true? If not, where are they used and for what?
*/
public static final int ACK = 3;
public static final int NACK = 4;
// Cmds options
/* FIXME: These need to be squared with spec. Where are they used.
*/
public static final int HANDCHECK = 1;
public static final int NONBLOCKING = 2;
public Header () {
srcAddr = new byte [4];
}
/**
* Utility methods for host to network (and vice versa) conversion
* for unsigned long and short.
*/
private static void htonl (int v, byte[] buffer, int offset) {
buffer [offset] = (byte) ((v & 0xff000000) >> 24);
buffer [offset + 1] = (byte) ((v & 0x00ff0000) >> 16);
buffer [offset + 2] = (byte) ((v & 0x0000ff00) >> 8);
buffer [offset + 3] = (byte) (v & 0x000000ff);
}
private static void htons (int v, byte[] buffer, int offset) {
buffer [offset] = (byte) ((v & 0xff00) >> 8);
buffer [offset + 1] = (byte) (v & 0x00ff);
}
private static int ntohl(byte[] buffer, int offset) {
return ((((int) buffer [offset]) << 24) & 0xff000000) |
((((int) buffer [offset + 1]) << 16) & 0xff0000) |
((((int) buffer [offset + 2]) << 8) & 0xff00) |
(((int) buffer [offset + 3]) & 0xff);
}
private static int ntohs(byte[] buffer, int offset) {
return ((((int) buffer [offset]) << 24) & 0xff000000) |
((((int) buffer [offset + 1]) << 16) & 0xff0000) |
((((int) buffer [offset + 2]) << 8) & 0xff00) |
(((int) buffer [offset + 3]) & 0xff);
}
public boolean initFromNetwork (byte[] buffer, int offset) {
cmd = buffer [offset];
if (cmd != PROPAGATE
&& cmd != UNICAST
&& cmd != ACK
&& cmd != NACK) return false;
srcAddr [0] = buffer [offset + 1];
srcAddr [1] = buffer [offset + 2];
srcAddr [2] = buffer [offset + 3];
srcAddr [3] = buffer [offset + 4];
srcPort = ntohs (buffer, offset + 5);
size = ntohl (buffer, offset + 7);
option = buffer [offset + 11];
packetId = ntohl (buffer, offset +12);
return true;
}
public void buildForNetwork (byte[] buffer, int offset) {
int tmpOffset = offset;
buffer [tmpOffset++] = cmd;
buffer [tmpOffset++] = srcAddr [0];
buffer [tmpOffset++] = srcAddr [1];
buffer [tmpOffset++] = srcAddr [2];
buffer [tmpOffset++] = srcAddr [3];
htons (srcPort, buffer, tmpOffset);
tmpOffset += 2;
htonl (size, buffer, tmpOffset);
tmpOffset += 4;
buffer [tmpOffset++] = (byte) option;
htonl (packetId, buffer, tmpOffset);
tmpOffset += 4;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -