Arrays 如何在D中使用UDP接收的动态数组?
我想创建一个简单的UDP服务器,可以接收不同长度的消息。然而,似乎D的Arrays 如何在D中使用UDP接收的动态数组?,arrays,sockets,udp,d,dynamic-arrays,Arrays,Sockets,Udp,D,Dynamic Arrays,我想创建一个简单的UDP服务器,可以接收不同长度的消息。然而,似乎D的Socket.receiveFrom()需要一个静态长度的缓冲区数组。当以下代码运行时: void main() { UdpSocket server_s; Address client_addr; ubyte[] in_buf; ptrdiff_t bytesin; server_s = new UdpSocket();
Socket.receiveFrom()
需要一个静态长度的缓冲区数组。当以下代码运行时:
void main() {
UdpSocket server_s;
Address client_addr;
ubyte[] in_buf;
ptrdiff_t bytesin;
server_s = new UdpSocket();
server_s.bind(new InternetAddress(InternetAddress.ADDR_ANY, PORT_NUM));
bytesin = server_s.receiveFrom(in_buf, client_addr);
if (bytesin == 0 || bytesin == Socket.ERROR) {
writeln("Error receiving, bytesin: ", bytesin);
return;
}
// Do stuff
}
receiveFrom()
立即通过bytesin==0
。为什么会这样?我甚至可以使用动态数组通过UDP进行接收吗?receive
和receiveFrom
自己不进行分配。您可以传递一个固定大小的数组,该数组足以容纳您期望的任何数据包,然后根据接收到的字节数对其进行切片
如果您预先分配了64KB,那么它应该适合您可以想象得到的所有内容。不过我倾向于使用4KB的缓冲区
ubyte[4096]in_buf;
bytesin=服务器的接收地址(in buf,client addr);
//然后先检查错误
自动消息_received=in_buf[0..bytesin];
//处理它
//继续循环,重复使用缓冲区,获得更多的东西
谢谢,就这样。我早该知道拜特辛就是为了这个。这应该在std.socket文档中有更详细的记录。见鬼,也许他们应该创建一个动态分配的版本。不过,底层操作系统功能需要一个缓冲区,它们的工作方式与这些完全相同。用不同的方式去做也许是可能的,但是很棘手而且没有什么好处。。。不过,我希望文档能用更多的例子更好地说明这一点。基本上,任何语言都要求您在接收之前分配缓冲区。您也可以创建自己的函数来实现它。我不认为它是std库的一部分。