工作中負責開發過資料轉送通用模組,跟隨者c++大牛們快速成長,本文分享一些心得。
1.基本的概念
建立tcp串連三向交握、斷開tcp串連四次握手,這兩個概念請自己google
2.錯誤排查工具:
1).netstat -anp |grep your's port:
此命令用於查看linux下你的連接埠的狀態,通過它可以觀察到串連是否建立、是否正常(狀態是established、收發棧為空白或者持續變化)、是否關閉伺服器的防火牆(經常會遇到機器的防火牆沒有stop,然後請求串連狀態處於sys send的狀態)。
2).查看連接埠資料流通情況的神器tcpdump
基本用法請自行google,學會幾個關鍵點:怎麼看一個包是push包還是answer包、能夠簡單的分析網路連接的狀態、儲存abc.pcap檔案然後可以在windows平台上用wirshark分析位元組(這點必須掌握,通常會抓包看資料轉送是否正常);
3).基本步驟:
先用1)查看網路連接是否正常,如果1)排查不出來,請用2)抓包分析;並且詳細審查你的代碼,邏輯不錯為根本。
3.程式模型:
說起網路編程,肯定離不開的另一個話題就是多線程,真實的情境下,幾乎都是並行收發處理資料,所以程式的模型至關重要。好的程式模型,不僅可以從效能上大大提高處理速度,而且能縮短研發周期。
在思考模型的時候主要考慮的點是:
1).IO的類型是nio還是bio,不同的類型決定了不同的執行緒模式
bio對應於一個線程一個串連,那麼當串連數量很多的時候(每個串連內部最好有自己的緩衝記憶體塊,也有公用的一塊大記憶體的,但是得用讀寫鎖去處理資料出入的問題,而且串連過多的時候,就算是讀寫鎖也未必能達到要求,所以多花點記憶體是值得的),要一個消費線程管理好幾個串連推送過來的資料
nio則把接收的資料拷貝先拷貝給一個分發線程,然後此分發線程將資料均衡的分配給n個消費線程,用並行化去提高處理速率
2).tcp串連的數量、每個串連的有效期間、每個串連的資料量
這些是決定使用哪類IO的重要依據,如果是長串連並且資料即時性要求高、資料量大,則bio;如果串連數量特別多(500+),則選擇nio。
3).學會畫模型圖,寫好設計文檔,類間的隊列不應該暴露出來(持有對象引用,調用相應的方法去push/pop元素)
4).在關鍵的地方要替換掉鎖,一種鎖的替換思路請參考我的這篇bloghttp://www.cnblogs.com/uttu/archive/2013/02/07/2908685.html在幾個邏輯重要點部分