poco 網絡編程


因為之前被坑的比較慘,所以明白一個好的網絡庫對項目穩定性有多大的幫助。

講一下,網絡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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM