2011-10-09 167 views
1

我知道標準的c庫函數fwrite和fread是一個排序緩衝的寫入和讀取系統調用的包裝,緩衝區用於我完全理解的性能原因。 我不明白的是在socket編程函數中寫入和讀取緩衝區的作用。 你能幫我理解它們的用途嗎,突出顯示與文件緩衝區的區別和相似之處?套接字和緩衝區

我在socket編程新手...

回答

3

當內核收到數據包時,它必須將這些數據放在某個地方。它將其存儲在緩衝區中。當你的應用程序進行下一次讀取時,它可以從這些緩衝區中獲取數據。如果您有UDP連接,並且您的應用程序不讀取這些緩衝區,則它會變滿並且內核開始丟棄接收到的數據包。如果您有TCP連接,只要緩衝區中有可用空間,它就會確認這些數據包,但在此之後它會發出信號,表示無法讀取更多數據。

寫入緩衝區是必需的,因爲網絡接口是稀缺資源,內核通常不能立即發送數據包。如果你做了一個大的寫()它可以被切碎成數百包。所以內核會將這些數據存儲在緩衝區中。如果您執行了大量小寫操作,緩衝區也很出色,請參閱Nagle's algorithm

+0

感謝您的明確和準確的答案。 – GionJh

2

試想一下,如果你在同一時間發送你的信息,一個字節。你會生成一個100字節的數據包發送1個字節,如果它是一個TCP連接,取決於實施,等到你有一個syn/ack發送更多?聽起來對我來說效率很低。

相反,您使用緩衝區來存儲大量數據並將其發送到單個數據包中,就像在寫入磁盤之前存儲數據一樣。

+1

該策略被稱爲http://en.wikipedia.org/wiki/Nagle%27s_algorithm,可以禁用。 –

+0

@yi_H我知道它有一個名字:-)謝謝!是的,如果你覺得你知道如何發送數據包比你的網絡庫的實現者可以被禁用。 – corsiKa

+0

不,可以禁用它立即發送數據包。延遲可能比浪費的帶寬更重要。 –