【发布时间】:2016-03-11 12:26:41
【问题描述】:
我正在使用 TFTP 服务器。根据图片,我的数据包的最大长度为 516 字节 (2+2+512)。
我试图从客户端数据报包中获取原始长度(在这种情况下,在 RRQ 数据包中发送 13 个字节),而不是获取我保存客户端数据报包的服务器数据报包长度(516 个字节)。
我需要它来提取文件名,我这样做了,但字符串内容是“文件名 + nullBytes”,那些空字节来自服务器数据报包。
这是我卡住的代码:
public static short RRQ = 1;
enter code here
public void dataMetod() throws IOException{
byte[] packet = new byte[516];
//socket with listening port 5000
DatagramSocket datagramSocket = new DatagramSocket(5000);
//while receive packets
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(packet,packet.length);
datagramSocket.receive(datagramPacket);
System.out.println("server: new packet!!:");
//create a byte[] with the "received packet length"(that's not true)
byte[] inData = new byte[datagramPacket.getLength()];
inData = datagramPacket.getData();
System.out.println("length: "+inData.length);
byte code;
code = inData[1];
System.out.println(code);
//check if its an RRQ packet
if (code == RRQ) {
System.out.println("server: RRQ PACKET!!");
String fileName = this.getFileName(inData);
System.out.println(fileName);
}
public String getFileName(byte[] inData) {
byte[] aux = new byte[inData.length - 7];
for (int i = 0; i < aux.length; i++) {
aux[i] = inData[i + 2];
}
return new String(aux);
}
【问题讨论】:
-
你怎么知道客户端实际上只发送了 13 个字节?你用的是什么客户端?
-
好的,抱歉,这是我的第一篇文章,正在处理中。
-
TFTP 说“文件名以空值结尾”。也许你应该依靠它。
-
“文件名以空值结尾”因为数据包长度,所以我依赖它。
-
不,文件名以单个 0x00 结尾,然后是“模式”和另一个 0x00。该规范没有说明“数据包中的最后七个字节”。 (模式也可以是“netascii”...)
标签: java sockets server datagram tftp