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

📄 dnsinputstream.java

📁 JAVA网络编程技术内幕一书的源代码
💻 JAVA
字号:
/* * Java Network Programming, Second Edition * Merlin Hughes, Michael Shoffner, Derek Hamner * Manning Publications Company; ISBN 188477749X * * http://nitric.com/jnp/ * * Copyright (c) 1997-1999 Merlin Hughes, Michael Shoffner, Derek Hamner; * all rights reserved; see license.txt for details. */import java.io.*;
import java.util.*;

public class DNSInputStream extends ByteArrayInputStream {
  protected DataInputStream dataIn;

  public DNSInputStream (byte[] data, int off, int len) {
    super (data, off, len);
    dataIn = new DataInputStream (this);
  }

  public int readByte () throws IOException {
    return dataIn.readUnsignedByte ();
  }

  public int readShort () throws IOException {
    return dataIn.readUnsignedShort ();
  }

  public long readInt () throws IOException {
    return dataIn.readInt () & 0xffffffffL;
  }

  public String readString () throws IOException {
    int len = readByte ();
    if (len == 0) {
      return "";
    } else {
      byte[] buffer = new byte[len];
      dataIn.readFully (buffer);
      return new String (buffer, "latin1");
    }
  }

  public String readDomainName () throws IOException {
    if (pos >= count)
      throw new EOFException ("EOF reading domain name");
    if ((buf[pos] & 0xc0) == 0) {
      String label = readString ();
      if (label.length () > 0) {
        String tail = readDomainName ();
        if (tail.length () > 0)
          label = label + '.' + tail;
      }
      return label;
    } else {
      if ((buf[pos] & 0xc0) != 0xc0)
        throw new IOException ("Invalid domain name compression offset");
      int offset = readShort () & 0x3fff;
      DNSInputStream dnsIn =
        new DNSInputStream (buf, offset, buf.length - offset);
      return dnsIn.readDomainName ();
    }
  }

  public DNSRR readRR () throws IOException {
    String rrName = readDomainName ();
    int rrType = readShort ();
    int rrClass = readShort ();
    long rrTTL = readInt ();
    int rrDataLen = readShort ();
    DNSInputStream rrDNSIn = new DNSInputStream (buf, pos, rrDataLen);
    pos += rrDataLen;
    try {
      String myName = getClass ().getName ();
      int periodIndex = myName.lastIndexOf ('.');
      String myPackage = myName.substring (0, 1 + periodIndex);
      Class theClass = Class.forName
        (myPackage + "record." + DNS.typeName (rrType));
      DNSRR rr = (DNSRR) theClass.newInstance ();
      rr.init (rrName, rrType, rrClass, rrTTL, rrDNSIn);
      return rr;
    } catch (ClassNotFoundException ex) {
      throw new IOException ("Unknown DNSRR (type " +
                             DNS.typeName (rrType) + " (" + rrType + "))");
    } catch (IllegalAccessException ex) {
      throw new IOException ("Access error creating DNSRR (type " +
                             DNS.typeName (rrType) + ')');
    } catch (InstantiationException ex) {
      throw new IOException ("Instantiation error creating DNSRR (type " +
                             DNS.typeName (rrType) + ')');
    }
  }
}

⌨️ 快捷键说明

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