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

标签 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);//

最佳答案

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

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

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

应该是

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

关于java - 数据报包接收缓冲区大小-java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33644159/

相关文章:

java - xml-apis JAR 文件是否必要?

python - 检查服务器是否在线的合理超时是多少?

linux - 通过 802.11n 的 UDP 单播 - L2 积极 ACK 对 Linux 套接字发送缓冲区的影响

node.js - 如何从字符串创建文件并通过 FormData 发送它

python - MessagePack 和消息帧

java - gradle包装器如何使用它的构建文件来保存安装gradle的表单?

java - @XmlSchema : "annotation type not applicable to this kind of declaration"

java - 如何获取可嵌入的更改?

c - c中的结构和标记 union

c - c中的缓冲区管理