Arrays 如何在D中使用UDP接收的动态数组?

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();

我想创建一个简单的UDP服务器,可以接收不同长度的消息。然而,似乎D的
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库的一部分。