2012-09-17 92 views
0

我已閱讀,在使用Erlang的發送調用gen_tcp通過套接字中的數據可以在單個流被聚集。我如何強制套接字發送完全特定數量的字節?發送的字節確切數目通過套接字

+1

目前尚不清楚你想解決什麼問題。發送的字節數將始終是您指定的數字。它永遠不會發送你要求它發送或發送你沒有要求發送的字節的字節。 –

+0

我的錯誤或實際或不同的發送操作可以彙總在一個單一的塊? {no_delay,false}應該是標準行爲 – user601836

+1

「單個塊」是什麼意思?如果您指的是您在單個TCP讀取操作中獲得的數據量,則它是任意的。這是TCP的基本屬性,對此您無能爲力。 –

回答

5

TCP是一個流協議(UDP不像其面向分組的),其例如也就是說,如果現有的數據來自於客戶端上的一個或幾個send()調用接收應用程序不能告訴。

你真的沒有過的字節數的任何控制在一個TCP數據包被髮送,多send()調用可能導致一個TCP數據包被接收,一個send()通話可能會導致一些TCP數據包被髮送。這由OS TCP堆棧控制。

在Erlang中你可以使用套接字選項{packet, 1|2|4}gen_tcp:connectgen_tcp:listen創建TCP數據的面向數據包的處理。這將插入1,2或4字節的前綴給每個send()和接收側(假設它也Erlang和使用相同的{packet, N}選項),直到已經接收到的字節數發送的將讀出的數據,而不管該消息是如何零散轉換成TCP數據包。

gen_tcp:recv的調用將阻塞,直到所期望的字節數已經被讀取。對於主動模式套接字,消息以預期的字節數發送。