如何在 D 中使用动态数组接收 UDP?
How can I use a dynamic array for UDP receipt in D?
我想创建一个简单的 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
不自己进行分配。您可以传递一个足够大的固定大小的数组来容纳您期望的任何数据包,然后根据您收到的字节数对其进行切片。
如果您预先分配了 64 KB,那应该可以满足您可能获得的所有需求。不过我倾向于只使用 4 KB 缓冲区。
ubyte[4096] in_buf;
bytesin = server_s.receiveFrom(in_buf, client_addr);
// check for error first then
auto message_received = in_buf[0 .. bytesin];
// process it
// keep looping, reusing the buffer, to get more stuff
我想创建一个简单的 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
不自己进行分配。您可以传递一个足够大的固定大小的数组来容纳您期望的任何数据包,然后根据您收到的字节数对其进行切片。
如果您预先分配了 64 KB,那应该可以满足您可能获得的所有需求。不过我倾向于只使用 4 KB 缓冲区。
ubyte[4096] in_buf;
bytesin = server_s.receiveFrom(in_buf, client_addr);
// check for error first then
auto message_received = in_buf[0 .. bytesin];
// process it
// keep looping, reusing the buffer, to get more stuff