JAVA - Tftp客户端如何设置块大小

时间:2013-03-25 12:19:29

标签: java networking tftp

我正在编写一个tftp客户端,只要我使用默认块大小(512),它就可以正常工作。但由于这是一项学校作业,我还需要测试它的块大小为1430和4300。

当我第一次与服务器通信时,我使用这种方法:

public void setFilename( String s, String mode) {
        byte []a = s.getBytes();
        int i,j,k;
        for ( i=0; i+2<lenght && i<a.length; i++ ) {
            packet[i+2] = a[i];
        }
        packet[i+2] = 0;
        a = mode.getBytes();
        for ( j=0,i++; i<lenght && j<a.length; i++,j++ ) {
            packet[i+2] = a[j];
        }
        packet[i+2] = 0;


    }

它将设置我想要读取的文件名。它运作得很好。

但我改变了它,所以我可以定义一个块大小:

public void setFilename( String s, String mode, String blockSize ) {
        byte []a = s.getBytes();
        int i,j,k;
        for ( i=0; i+2<lenght && i<a.length; i++ ) {
            packet[i+2] = a[i];
        }
        packet[i+2] = 0;
        a = mode.getBytes();
        for ( j=0,i++; i<lenght && j<a.length; i++,j++ ) {
            packet[i+2] = a[j];
        }
        packet[i+2] = 0;

        a = BLOCKSIZE.getBytes();
        for ( k=0,i++; i<lenght && k<a.length; i++,k++ ) {
            packet[i+2] = a[k];
        }
        packet[i+2] = 0;

        a = blockSize.getBytes();
        for ( k=0,i++; i<lenght && k<a.length; i++,k++ ) {
            packet[i+2] = a[k];
        }
        packet[i+2] = 0;

    }

这里BLOCKSIZE =“blksize”(字符串)和blockSize = 1430(int); 问题是,它不起作用: - /

有人可以向我解释如何定义块大小?

谢谢你们: - )

2 个答案:

答案 0 :(得分:0)

问题在于阅读部分,而不是在这里。 如果有兴趣的话,这是构建数据包的完整代码: - )

/ **  *

 * TftpPacket - look at a byte array as a tftp packet.
 *
 * 

Message format according to the TFTP protocol (rfc 1350, 2347). *

Note: this implementation assumes that all JAva Strings used only contain * ASCII characters. If it's not so, lenght() and getBytes() return different values * and unexpected problems can appear ...

*tftp request packet * 2 bytes string 1 byte string 1 byte optional options (strings) * -----------------------------------------+ - - - + - + - - - + - + -> *RRQ/WRQ | 01/02 | Filename | 0 | Mode | 0 | opt1 | 0 | value1| 0 | ... * -----------------------------------------+ - - - + - + - - - + - + -> * Modes (ascii chars/1 byte each): * "netascii", "octet",... * * 2 bytes 2 bytes n bytes * --------------------------------- *DATA | 03 | Block # | Data | * --------------------------------- * 2 bytes 2 bytes * ------------------- *ACK | 04 | Block # | * -------------------- * 2 bytes 2 bytes string 1 byte * ---------------------------------------- *ERROR | 05 | ErrorCode | ErrMsg | 0 | * ---------------------------------------- * Error Codes: * 0 Not defined, see error message (if any). * 1 File not found. * 2 Access violation. * 3 Disk full or allocation exceeded. * 4 Illegal TFTP operation. * 5 Unknown transfer ID. * 6 File already exists. * 7 No such user. *

 * /

public class TftpPacket {

// Opcodes
protected static final short RRQ=1;
protected static final short WRQ=2;
protected static final short DATA=3;
protected static final short ACK=4;
protected static final short ERROR=5;
protected static final String BLOCKSIZE = "blksize";

byte []packet;
int lenght;

/**
 *  Builds a view to a byte array as a tftp packet.
 *  The original byte array is the one manipulated by all methods
 */
public TftpPacket( byte []data, int len ) {
    packet = data;
    lenght = len;
}

/**
 *  Gets number at first two bytes of packet
 */
public int getOpcode() {
    return (packet[0]<<8)|(packet[1]&0xff);  //net byte order = Big-Endian
}

/**
 *  Sets first two bytes of packet
 */
public void setOpcode(int code) {
    packet[0] = (byte) ((code>>8)&0xff);
    packet[1] = (byte) (code&0xff);
}

/**
 *  Gets string starting at byte 2
 */
public String getFileName() {
    int i;
    for ( i=2; i<lenght; i++ )
        if (packet[i]==0) //end of string
            return new String(packet, 2, i-2);
    return null;
}

/**
 *  Sets two strings (NUL terminated) starting at byte 2
 */
public void setFilename( String s, String mode, String blockSize ) {
    byte []a = s.getBytes();
    int i,j,k;
    for ( i=0; i+2<lenght && i<a.length; i++ ) {
        packet[i+2] = a[i];
    }
    packet[i+2] = 0;
    a = mode.getBytes();
    for ( j=0,i++; i<lenght && j<a.length; i++,j++ ) {
        packet[i+2] = a[j];
    }
    packet[i+2] = 0;

    a = BLOCKSIZE.getBytes();
    for ( k=0,i++; i<lenght && k<a.length; i++,k++ ) {
        packet[i+2] = a[k];
    }
    packet[i+2] = 0;

    a = blockSize.getBytes();
    for ( k=0,i++; i<lenght && k<a.length; i++,k++ ) {
        packet[i+2] = a[k];
    }
    packet[i+2] = 0;

}

/**
 *  Gets second string in packet
 */
public String getMode(){
    for ( int i=2; i<lenght; i++ )
        if (packet[i]==0) { //end of 1st string
            for ( int j=i+2; j<lenght; j++ )
                if ( packet[j]==0 ) return new String(packet, i+1, j-i-1);
        }
    return null; 
}

/**
 *  Gets number at bytes 2 and 3 of packet (can be block count or error code)
 */
public int getBlockCount() {
    return (packet[2]<<8)|(packet[3]&0xff);  //net byte order = Big-Endian
}

/**
 *  Sets bytes 2 and 3 of packet (can be block count or error code)
 */
public void setBlockCount(int count) {
    packet[2] = (byte) ((count>>8)&0xff);
    packet[3] = (byte) (count&0xff);
}

/**
 *  Sets string (NUL-terminated) starting at byte 4
 */
public void setErrMsg( String s ) {
    byte []a = s.getBytes();
    int i;
    for ( i=0; i<a.length; i++ ) {
        packet[i+4] = a[i];
    }
    packet[i+4] = 0;
}

}

答案 1 :(得分:-3)

我建议您使用Wireshark,看看数据包如何符合并发送到线路。 这样,您可以在代码中组装TFTP协议时快速发现任何问题。