2015-11-28 45 views
1

我想創建一個簡單的UDP服務器,可以接收不同長度的消息。但是,D的Socket.receiveFrom()看起來好像是一個靜態長度的緩衝區數組。當下面的代碼運行:如何在D中爲UDP接收使用動態數組?

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接收?

回答

1

receivereceiveFrom不自己做配置。您可以傳遞一個足夠大的固定大小的數組來保存您期望的任何數據包,然後根據您收到的字節數進行分片。

如果您預先分配了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 
+0

謝謝,就是這樣。應該知道這正是字節數。這應該在std.socket文檔中有更好的記錄行爲。哎呀,也許他們應該創建一個動態分配的版本。 – Nerve

+0

底層的OS功能需要一個緩衝區,但它們的工作方式與這些功能完全相同。不同的做法可能是可能的,但棘手的,無論如何沒有多大的好處...我希望文檔通過更多的例子更好地說出來。 –

+0

基本上任何語言都要求您在接收之前分配緩衝區。你也可以創建自己的功能。我沒有看到它成爲std庫的一部分的原因。 – Bauss