erlang套接字
Erlang的套接字可以有三種打開模式:主動(active)、單次主動(active once)或被動(passive)。
這是通過在gen_tcp:connect(Address, Port, Options)或gen_tcp:listen(Port, Options)
的Options參數里加入{active, true | false | once}選項實現的。
如果指定{active, true}就會創建一個主動套接字,指定{active, false}則是被動套接
字。{active, once}創建的套接字只會主動接收一個消息,接收完之后必須重新啟用才能接收
下一個消息。
一、主動型
當一個主動套接字被創建后,它會在收到數據時向控制進程發送{tcp, Socket, Data}
消息。控制進程無法控制這些消息流。惡意的客戶端可以向系統發送成千上萬的消息,
而它們都會被發往控制進程。控制進程無法阻止這些消息流。
進程無法控制通往服務器循環的消息流。如果客戶端生成數據的速度快于服務器處理數
據的速度,系統就會遭受數據洪流的沖擊:消息緩沖區會被塞滿,系統可能會崩潰或表現異常。
?
二、被動型
如果一個套接字是用被動模式打開的,控制進程就必須調用gen_tcp:recv(Socket, N)
來從這個套接字接收數據。然后它會嘗試從套接字接收N個字節。如果N = 0,套接字就
會返回所有可用的字節。在這個案例里,服務器可以通過選擇何時調用gen_tcp:recv來
控制客戶端所發的消息流
?
三、混合型
既不是阻塞也不是非阻塞。用{active, once}選項打開套接字。套接字在這個模式下雖然是主動的,但只針對一個消息。當控制進程收到一個消
息后,必須顯式調用inet:setopts才能重啟下一個消息的接收,在此之前系統會處于阻塞狀態。這種方法集合了前兩種模式的優點
?
轉載于:https://www.cnblogs.com/yanwei-wang/p/4710436.html
總結
- 上一篇: Linux编程MQTT实现主题发布订阅
- 下一篇: EXCEL转PDF方法之使用PDF虚拟打