2012-11-20 56 views
2

我已經看到許多tcp/ip的開源框架和最佳實踐建議不要重複使用傳遞給tcp層進行傳輸的緩衝區。它背後的原因是什麼?緩衝區是不是真的被複制到內核中,那麼關於不重用緩衝區的內容是什麼? 一個典型的例子的上述將將是爲什麼不重用消息緩衝區在tcp的情況下

char data[1024] = {'1', '2'.................'1024'}; 
write(socket, data, 1024); 
data = {'a', 'b','c'...........}; //reusing the buffer 

ZeroMQ提供API,以創建一個緩衝區,並刪除它和它們強烈建議不使用它。 Netperf創建一個環緩衝區並確保它不會重用它當前寫入套接字的緩衝區。

+3

你可以更具體一些,並複製粘貼一個片段,它與一個建議的替代方案?我目前唯一的猜測是,這可能是在預期[零拷貝](http://en.wikipedia.org/wiki/Zero-copy)API的情況下完成的。 – dasblinkenlight

+0

它必須完全取決於您使用的界面。如果你上面寫的代碼被破壞了,那麼很多程序都被破壞了。在調用write()之後掛在緩衝區上的唯一原因是寫入不能寫入所有數據,並且必須再次調用它。 –

+1

我從來沒有在20多年的網絡編程中看到這個毫無意義的建議。你在哪裏讀過的? – EJP

回答

2

write()send()都會將您的數據複製到TCP「發送窗口」,所以您不必擔心在這些調用之後在程序中更改它。但是,請注意,非阻塞套接字可能不會複製全部您的數據,因此您應該檢查返回代碼以找出實際寫入的字節數。

可能某些自定義TCP堆棧(可能適用於非常小的嵌入式系統)需要數據保留,但沒有主流操作系統需要這樣做。

相關問題