一. 程式設計前必備的基礎知識:
(1) 網路基礎。你必須知道以下幾點:
①熟悉tcp/ip協議四層模型,包括物理層、ip層、tcp/udp層和應用層,熟悉滑動視窗等實現機制。
②我們一般所指的socket程式設計都是指tcp程式設計。由於udp程式設計比較簡單,而tcp的socket程式設計複雜得多,經常出現各種各樣莫名其妙的問題,所以socket程式設計一般都是指tcp程式設計,下文如果沒有特別說明,也都是指tcp程式設計。
③tcp與udp的區別:tcp是面向連線的,除資料流的結尾無法從網路層預知是否全部接收到,中間是不會丟包的,不會丟掉任何乙個位元組;而udp是無連線的,丟包是正常現象。
④ tcp是「全雙工的位元組流」,對這幾個字必須要有透徹的理解,否則程式設計時就是乙個馬大哈,知其然不知其所以然。關於這幾個字的理解,可以參考筆者的另外一篇部落格文章「tcp的socket程式設計中全雙工的位元組流含義的深刻理解」(
(2) 程式設計前的基礎知識
① socket程式設計的注意事項,參考筆者的另外一篇部落格文章「tcp的socket程式設計中常見問題及注意事項」(
② 阻塞與非阻塞。socket支援阻塞與非阻塞兩種工作模式,通常網路上介紹的文章,都是使用預設的阻塞模式的。關於非阻塞模式的介紹,以及函式的各種返回值和各種細節,網際網路上無論是國內或國外,資料幾乎沒有,需要自己測試。
③ 應用層協議採用二進位制還是文字。他們各優缺點,通常,二進位制長度更短,效率更高,但開發新手容易出錯,比如大小端直接轉換;文字簡單,人可讀,測試容易,但是傳輸的長度更長,字串解析的效率不高。兩者都能使用,由你根據自己的實際情況選擇。
④ 區域網與廣域網。只要網路是通暢的,區域網與廣域網都可以進行tcp通訊,一般沒有多大區別,但是如果要改善使用者體驗,兩者的區別就大了。比如你的程式一端在區域網一旦停止,那麼對端的socket程式立馬能感知到;但是如果在廣域網,你一端的程式停止,如果細節處理不好,對端可能出現程式假死,不響應的情況,可能需要幾秒甚至一分鐘或幾分鐘以後才能響應,這些都需要長時間的實踐才能編寫出質量***的軟體,對於新手,這些細節都是問題。
⑤ 記住要加包頭、加心跳包等很多需要注意的問題。
所以,對於2至3年的程式設計師,socket程式出現卡頓、假死、效率低、不同鏈結相互影響、程式死掉等各種莫名其妙的問題實在是太多了,如果要寫出高質量的軟體,沒有高深的c/c++語言的功底,在加上3年至5年以上的socket程式設計實踐,是不可能做得好的。
二. socket程式設計流程。以下只列出基本的程式流程。
無論對於客戶端或服務端,要提高socket效能,必須使用多執行緒方式,進行收發,否則無法做到socket通訊的「全雙工」,效能至少損失一半。尤其對於有使用者ui介面進行操作的軟體來說,必須將socket通訊放到後台執行緒中,否則,一定導致介面假死、卡頓、使用者操作不流暢等問題,尤其是在廣域網環境,使用者體驗會極差,從而導致專案失敗,這種失敗的例子在筆者接觸的公司及產品中不勝列舉。
三. 做好socket程式設計必備的前提條件
要想使用c/c++寫好socket程式,必備的的前提條件如下:
(1) 極好的c/c++基礎,包括指標,stl等基礎知識。
(2) 多執行緒程式設計,必須精通。
(3) 各種執行緒鎖或程序鎖、事件、條件變數等執行緒同步機制,必須精通。
(4) 對socket程式設計至少有2至3年的實踐經驗及深刻的理論理解,尤其是對非阻塞socket需要自己探索,知道如何使用執行緒間的同步機制平衡cpu空迴圈、cpu阻塞等待、如何用好快取等各方面的知識。
四. 結束語
要做乙個專業的socket程式的難度還是非常高的,必須有相當多的積累才可能編出質量過硬的軟體。如果大家覺得難度過大,或者時間精力不足以從頭開始編碼,建議使用第三方的socket封裝庫來實現,專業的事情留給專業的人來做,站在巨人的肩膀上,質量更***,比起招聘幾個程式設計師或團隊研究2至3年還不一定能出成果相比,使用第三方socket封裝庫質量可靠得多。比如waisock就是乙個非常優秀的socket封裝庫,該專案在知名公司的多個大型專案中使用過,經過了反覆的錘煉,穩定可靠,效能卓越,官網是 ,大家不妨試試。
使用Socket庫進行TCP程式設計
2.客戶端tcp連線 執行結果 匯入socket庫及依賴庫 import socket import threading import time 建立tcp連線 s socket.socket socket.af inet,socket.sock stream 繫結位址及監聽埠 s.bind 127...
C C 使用Socket通訊UDP
接收端 1 include 2 include 3 4 pragma comment lib,ws2 32.lib 56 int main void 7 通訊資料緩衝區 13int nbuflen 1024,nresult 0,nsenderaddrsize sizeof ssendaddr 141...
用eclipse進行C C 程式設計
1 進入這個 http download.eclipse.org tools cdt releases ganymede 啟動eclipse,help software updates find and install.search for new features to install new r...