我正在嘗試爲程序製作套接字管理器。套接字 - 接收確切數量的數據
我的問題是,我需要從套接字檢索一個確切數量的數據到緩衝區。
1)使用靜態數組
製作這樣一個靜態緩衝區爲我工作,但我不能總是知道要接收的數據的大小。
ubyte[2] buffer;
socket.receive(buffer);
這是行不通的:
int size = buffer[0]; // for example ...
ubyte[size] buffer2; // crash at compilation because size is not known
socket.receive(buffer2);
所以我的第一個問題是:是否可以有靜態數組沒有在編譯知道它的大小?
我已經搜查了一種使用動態緩衝區,但我已經encoutered其他問題。
2)使用切片從緩衝區
ubyte[] buffer;
socket.receive(buffer);
ubyte[2] header = buffer[0..2];
這工作,但我怎麼可以從主緩衝區取出提取切片提取數據? 使用從std.algorithm remove函數與一個元組,這樣一來:
buffer = remove(buffer,tuple(0,2));
不爲我工作,我不知道爲什麼,我有這樣的錯誤在編譯:
Error: undefined identifier tuple
這裏有什麼問題?
而且,我的插座是非阻塞的,因爲我希望它是異步的。 如果套接字嘗試同時在其上推送數據,那麼在主緩衝區上執行刪除操作會導致問題嗎?
謝謝你看我,對不起我可憐的英語,我不是一個母語的人。
謝謝你提供的所有這些信息。我能夠做出一些事情,但仍然存在一個問題:'ubyte [] content = new ubyte [size];'使內容的長度等於大小,所以我無法測試套接字接收到的數據的長度緩衝......有沒有辦法得到它? – Munrek 2013-04-28 17:02:05
這就是爲什麼我的例子調用receive()兩次:一次獲取長度,一次獲取大小的數據。在套接字編程中沒有辦法解決這個問題,除非你可以做出一個好的猜測並在稍後修復它。如果您可以在編譯時進行猜測,那麼執行下列其中一個:'ubyte [sizeGuess] buffer;'或'ubyte [] buffer = new ubyte [sizeGuess];'。例如: ubyte [] buf = new ubyte [sizeGuess]; auto nBytes = socket.receive(buf); assert(nBytes> 2); ushort size = bigEndianToNative!ushort(buf [0..2]); assert(nBytes - 2> = size); //可以更好;) buf = buf [2 .. size + 2]; – chadjoan 2013-04-28 18:28:28
很難在這些評論中格式化代碼。 [http://dpaste.dzfl.pl/fff2cee8](http://dpaste.dzfl.pl/fff2cee8) – chadjoan 2013-04-28 18:37:16