数据报包接收缓冲区大小-java

时间:2015-11-11 04:11:34

标签: java udp buffer datagram

我尝试接收具有固定缓冲区大小的数据报包,然后根据接收数据包进行调整。我可以获得接收数据包的实际缓冲区大小,但是当我将其写入具有调整大小的另一个缓冲区时,它会再次改变或增大其大小。怎么可能呢?我希望它能使数组超出绑定异常。

byte[] recvbuffer=new byte[1024];
byte[] databuf=new byte[k-8];
byte[] checksumbuf=new byte[8];

recvpacket[i]=new DatagramPacket(recvbuffer,recvbuffer.length);
sock.receive(recvpacket[i]);
System.out.println(new String(recvbuffer));//1

int k=recvpacket[i].getLength();//k=28
System.out.println(k);

byte[] buffer=new byte[k];//buffer of size 28
System.out.println(buffer.length);
buffer=recvbuffer;
//buffer=recvpacket[i].getData();
System.out.println(new String(buffer));//buffer of size 1024, but how?
System.out.println(buffer.length);//

1 个答案:

答案 0 :(得分:2)

不要这样做。只需将其设置为最大的预期数据报大小加1。然后,如果你得到一个这么大的,这是一个协议错误(可能更大)。

处理收到的DatagramPacket时,您应该通过DatagramPacket.getLength().使用实际长度。例如,您的

System.out.println(new String(recvbuffer));//1

应该是

System.out.println(new String(recvpacket[i].data(), 0, recvpacket[i].getLength()));