Erlang網路通訊

2021-08-18 10:42:28 字數 970 閱讀 1860

鏈結建立的三個步驟

1、listen埠

埠listen的時候,核心會維護2個佇列,乙個佇列存放未完成的連線,乙個佇列存放已完成的連線。這裡的未完成的連線指的是客戶端第一次握手包被伺服器收到的連線,已完成的連線指的是客戶端第三次握手包被伺服器收到的連線。

2、accept鏈結

1)accept的時候,會從已完成的佇列獲取連線。

2)非同步accpet實現

通常是鏈結完成通知accept接收(但此時如果伺服器完成鏈結,accept被其他呼叫沒有收到這個鏈結,客戶端剛好來rst訊息,unix發現鏈結沒有處理會中斷)。

3)erlang實現的async_accept

erlang的gen_tcp:accept的實現是基於prim_inet:async_accept的,而prim_inet:async_accept是非同步的方式。 

所以,erlang底層關於prim_inet:async_accept的實現應該就是上面說的 nonblocking accept + select/poll/epoll 的方式。

3、如何更高效的accpet

單個程序使用async_accept並不能提高這種情況的處理效率。其實這個情況我們可以建立多個程序同時accept socket。這個方案也是很常見的,ranch(erlang的網路accept庫)就是使用了這一方案。ranch的做法大概是由ranch_acceptor_sup開始gen_tcp:listen,並把得到的listensokcet傳遞給多個子程序ranch_acceptor,然後每個ranch_acceptor都開始阻塞在gen_tcp:accept(listensocket, timeout)上,然後在同時大量連線到來的時候,這些程序會有序地乙個個accept到socket。 

(用ranch做了乙個測試,當連線乙個個到來的時候,發現ranch_acceptor程序是很有順序地乙個個被呼叫的然後返回socket,可見內部的排程演算法還是很合理的,而且也預料到會有多程序呼叫這種情況的出現)

C 網路通訊

c 網路通訊 一 伺服器端程式 10.17 1.建立伺服器端socket 1 使用socket類 建立伺服器socket物件 socket objs new socket 引數 使用ipendpoint類設定伺服器ip位址和埠號 或使用dns類 ipaddress serip ipaddress.p...

Winsock網路通訊

winsock網路通訊 這裡我希望和大家 一下winsock網上通訊的程式,由於網際網路的普及,越來越多的程式具有了在網上與其他程式通訊的功能.其實所有這些功能都建立在winsock介面之上,應用程式執行大多數網路通訊的基本物件稱為套介面或軟插口 socket 使用mfc winsocket類新增網...

Winsock網路通訊

winsock網路通訊 這裡我希望和大家 一下winsock網上通訊的程式,由於網際網路的普及,越來越多的程式具有了在網上與其他程式通訊的功能.其實所有這些功能都建立在winsock介面之上,應用程式執行大多數網路通訊的基本物件稱為套介面或軟插口 socket 使用mfc winsocket類新增網...