2015-02-07 71 views
0

考慮以下幾點:二郎網絡編程TCP和UDP消息v包

{ok, ListenSocket} = gen_tcp:listen(Port, [binary, {packet, 4}, {reuseaddr, true}, {active, once} ]), 
    {ok, AcceptSocket} = gen_tcp:accept(ListenSocket), 
    receive 
    {tcp, Socket, Bin} -> 
     case binary_to_term(Bin) of 
     {store, Value} -> 
      Uid = kvstore:store(Value), 
      send(Socket,Uid); 
     {retrieve, Key} -> 
      send(Socket,kvstore:retrieve(Key)) 
     end 
    end 

(該發送樂趣關閉套接字)。

  • 我假設的EVM負責重建ñ包組成的消息並沒有用戶代碼的?
  • 在哪種情況下會有一個非常大的消息可能會溢出套接字緩衝區的風險?
  • 這些陳述同樣適用於UDP嗎?

回答

3

當您爲接收方指定{packet, N}時,表示發送方包含一個指示數據包長度的4字節的big-endian標頭。 Erlang運行時會讀取該頭文件,從一個或多個網絡數據包中組裝大小的消息,然後將其發送到控制進程。標題不是消息的一部分。

如果您指定{packet, 4}則消息大小限制爲2GB(是,2,不是4;請參閱the documentation)。這樣的消息不會溢出任何套接字緩衝區,因爲消息是從通常較小的底層網絡數據包組裝的。但是對於給定的應用程序,例如內存受限的嵌入式系統,它可能太大,在這種情況下,人們可能會使用{packet, 2}代替該協議。

這些語句也適用於UDP,但考慮到UDP數據包可能被丟棄或按順序到達,除非應用程序確保整個消息始終適合網絡數據包,否則它不是很有用。