因為之前被坑的比較慘,所以明白一個好的網絡庫對項目穩定性有多大的幫助。
講一下,網絡IO模型有哪幾個種類,
阻塞:
1.一問一答(send()一個,recv() 一個)
2.一問多答(send()一個,recv() 多個)
非阻塞:
1.一個線程一直recv(), send() 按需發送
2.一個線程send(),一個線程recv()
所有的網絡IO模型 ,建議參考 陳碩 <linux網絡編程>
參考
【翻譯】兩種高性能I/O設計模式(Reactor/Proactor)的比較
還需要根據自己的業務 確認使用長連接,短連接(有狀態,無狀態), TCP還是UDP, 服務端超時T線, 黑名單, !
如何使用POCO 最好還是應該從代碼實現來看,確認各個類的繼承關系,全部看完基本就知道,自己要用什么了。(使用參考TestSuit,Sample)
看需求,確認用哪個類,
- 如果你用http進行POST GET REQUEST處理,那么 *HTTP、HTTPClient、 HTTPServer*應該是你的選擇,
- 如果你要用ping命令探查一些主機是否在線,那么就用*ICMP* 。
- 如果要用socket進行收發數據,
先確認 是寫client端還是Server端, 使用TCP還是UDP,是阻塞還是非阻塞,是否有發廣播等等...
client可以用:【Socket】中的Socket,StreamSocket, RawSocket,DatagramSocket...
Server可以用:【Socket】中的Socket,StreamSocket, RawSocket,DatagramSocket...
【Reactor】中的ParallelSocketAcceptor,ParallelSocketReactor,SocketAcceptor,SocketConnector,SocketNotification,SocketNotifier,SocketReactor
【TCPServer】中的TCPServer,TCPServerConnection,TCPServerConnectionFactory,TCPServerDispatcher,TCPServerParams
當然這只是其中的很小一部分。
無狀態,sendBytes(),recvBytes()都是不確定的
首先sendBytes()有事件就發送,很簡單沒問題。
那recvBytes()呢?如何一直接收數據?
這又回到更原始的問題,網絡模型 select,poll,epoll,是什么,用什么實現的。
我們知道,select,poll都是先把fd加入set中, 然后對set中所有fd進行輪訓,確認是否可以read,write,或者exception.
首先系統函數select中只是對set中所有的fd進行輪訓一次。
那么select(),poll(),只是查詢一次, 如果下次又來了數據怎么辦?
=>只能用while()不管去輪訓狀態了,
所以不斷接收數據的模型是這樣的
windows select參考
https://msdn.microsoft.com/en-us/library/system.net.sockets.socket.select(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740141(v=vs.85).aspx
unix-like 參考
http://www.tenouk.com/Module41.html