我正在编写一个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); 问题是,它不起作用: - /
有人可以向我解释如何定义块大小?
谢谢你们: - )
答案 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协议时快速发现任何问题。