網絡編程

Linux Socket編程(不限Linux)

C/C++ socket編程教程:1天玩轉socket通信技術?


一些基本概念

socket:套接字,計算機之間進行通信的一種約定。
網絡編程:編寫程序使兩臺聯網的計算機相互交換數據。

典型應用:Web 服務器和瀏覽器。瀏覽器獲取用戶輸入的URL,向服務器發起請求,服務器分析接收到的URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。

確定計算機位置:IP地址。有了IP地址可以找到目標計算機,但仍不能通信,端口號用來區分不同的網絡程序(web ftp smtp)。端口(Port)是一個虛擬的、邏輯上的概念。

協議(Protocol)就是網絡通信的約定,通信的雙方必須都遵守才能正常收發數據。

數據傳輸方式:???????????????????????????????????????????????????????????????????????????????????????????????????????????????
1) SOCK_STREAM 表示面向連接的數據傳輸方式(http協議 網頁)??????????? ? ? ? ? ? ? ? ? ? ? ?? ???
2) SOCK_DGRAM 表示無連接的數據傳輸方式(QQ視頻和語言)


socket() 函數用來創建套接字,確定套接字的各種屬性,然后服務器端要用 bind() 函數將套接字與特定的IP地址和端口綁定起來,只有這樣,流經該IP地址和端口的數據才能交給套接字處理;而客戶端要用 connect() 函數建立連接。

對于服務器端程序,使用 bind() 綁定套接字后,還需要使用 listen() 函數讓套接字進入被動監聽狀態,再調用 accept() 函數,就可以隨時響應客戶端的請求了。listen() 只是讓套接字進入監聽狀態,并沒有真正接收客戶端請求,listen() 后面的代碼會繼續執行,直到遇到 accept()。accept() 會阻塞程序執行(后面代碼不能被執行),直到有新的請求到來。

可以使用 write()/send() 函數發送數據,使用 read()/recv() 函數接收數據。數據的接收和發送是無關的,read()/recv() 函數不管數據發送了多少次,都會盡可能多的接收數據。也就是說,read()/recv() 和 write()/send() 的執行次數可能不同。例如,write()/send() 重復執行三次,每次都發送字符串"abc",那么目標機器上的 read()/recv()可能分三次接收,每次都接收"abc";也可能分兩次接收,第一次接收"abcab",第二次接收"cabc";也可能一次就接收到字符串"abcabcabc"。

數據的“粘包”問題:客戶端發送的多個數據包被當做一個數據包接收。也稱數據的無邊界性,read()/recv() 函數不知道數據包的開始或結束標志(實際上也沒有任何開始或結束標志),只把它們當做連續的數據流來處理。

TCP套接字的阻塞模式。所謂阻塞,就是上一步動作沒有完成,下一步動作將暫停,直到上一步動作完成后才能繼續,以保持同步性。每個 socket 被創建后,都會分配兩個緩沖區,輸入緩沖區和輸出緩沖區,write()/send(),read()/recv()可能會發生阻塞。

close()/closesocket()shutdown()
shutdown() 用來關閉連接,而不是套接字,不管調用多少次 shutdown(),套接字依然存在,直到調用 close() / closesocket() 將套接字從內存清除。


TCP三次握手

TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連接的、可靠的、基于字節流的通信協議,數據在傳輸前要建立連接,傳輸完畢后還要斷開連接。

Seq:序號
Ack:確認號
SYN:標志位,表示該數據包用來建立連接

三次握手的關鍵是要確認對方收到了自己的數據包,這個目標就是通過“確認號(Ack)”字段實現的。計算機會記錄下自己發送的數據包序號 Seq,待收到對方的數據包后,檢測“確認號(Ack)”字段,看Ack = Seq + 1是否成立,如果成立說明對方正確收到了自己的數據包。

TCP 套接字的數據交換過程

主機A分2次(分2個數據包)向主機B傳遞200字節的過程。


注意Ack 號為 1301 而不是 1201,原因在于 Ack 號的增量為傳輸的數據字節數。假設每次 Ack號不加傳輸的字節數,這樣雖然可以確認數據包的傳輸,但無法明確100字節全部正確傳遞還是丟失了一部分,比如只傳遞了80字節。


因此按如下的公式確認Ack 號:Ack號 = Seq號 + 傳遞的字節數 + 1

客戶端主動斷開連接

TIME_WAIT 要等待 2MSL(Maximum Segment Lifetime,報文最大生存時間) 才會進入 CLOSED 狀態。ACK 包到達服務器需要 MSL 時間,服務器重傳 FIN 包也需要 MSL時間,2MSL 是數據包往返的最大時間,如果 2MSL 后還未收到服務器重傳的 FIN 包,就說明服務器已經收到了 ACK 包。


UDP 是非連接的傳輸協議,沒有建立連接和斷開連接的過程。UDP不必調用 listen() 和 accept() 函數。UDP中只有創建套接字的過程和數據交換的過程。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,665評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內容

  • 最近在看《UNIX網絡編程 卷1》和《FREEBSD操作系統設計與實現》這兩本書,我重點關注了TCP協議相關的內容...
    腩啵兔子閱讀 1,186評論 0 7
  • 引言 網絡學習的核心內容就是網絡協議的學習 網絡協議:網絡中進行數據交換而建立的規則、標準或者說是約定的集合因為不...
    _涼風_閱讀 2,050評論 8 22
  • 1. 網絡編程概述 1.1 計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接...
    JackChen1024閱讀 1,048評論 0 3
  • 親愛的同學: 彈指一揮間,一晃畢業多年。 曾記否,畢業前,淚眼揮手相送; 現如今,畢業后,記憶儼然朦朧。 感慨萬千...
    蝶戀花人戀情閱讀 284評論 0 2
  • 兒子問到書買了沒?手機買了沒?我答,書買了,手機沒貨。然后就聊到使用手機的管控,接受思源的指導,在使用手機協議書方...
    伶麗閱讀 271評論 5 3