TCP客戶端與伺服器函式呼叫過程及特殊情況

2021-08-22 04:59:09 字數 1067 閱讀 2549

基本結構如下圖所示:

一般而言伺服器是被動建立連線,伺服器呼叫socket建立套接字,bind給socket分配具體的ip位址以及埠號,再呼叫listen函式將剛建立好的socket放入監聽佇列,之後呼叫accept等待指定位址(協議)的客戶端的連線。

客戶端呼叫socket建立套接字,隨後connect來建立連線,客戶端的socket的bind操作在connect中隱藏完成。

呼叫connect之後發生「三次握手」建立tcp連線,隨後客戶端與伺服器之間開始傳輸資料;

客戶端呼叫close(),發生「四次揮手」撤銷tcp連線。

特殊情況:

1、在accept返回之前連線終止

由於系統中斷或客戶端傳入rst,解決辦法:再次呼叫accept即可。因為tcp連線是在核心之中完成的,與accept函式執行並未干係。

2、伺服器程序崩潰(子程序終止)

伺服器主動傳送fin關閉tcp連線的伺服器端,但實際上是伺服器的程序都kill掉了,於是客戶端繼續傳送資料,這時候伺服器只能響應乙個rst,客戶端有可能選擇忽視掉rst訊號,而繼續接收資料(例如立刻呼叫別的讀取資料函式),此時就會返回乙個錯誤。

3、伺服器主機崩潰(斷網)

一般情況下會一直由tcp重傳機制來不斷重傳,直到超出tcp重傳定時器所設時限。視為放棄連線,返回伺服器不可達錯誤;

也可以使用keep-alive策略;

keepalive,是在tcp中乙個可以檢測死連線的機制。

1).如果主機可達,對方就會響應ack應答,就認為是存活的。

2).如果可達,但應用程式退出,對方就發rst應答,傳送tcp撤消連線。

3).如果可達,但應用程式崩潰,對方就發fin訊息。

4).如果對方主機不響應ack, rst,繼續傳送直到超時,就撤消連線。預設兩個小時。

4、伺服器主機崩潰後重啟

如果不採用keepalive策略,則重啟後的主機對客戶端發來的資料回報以rst,則跟上述一樣,會得到乙個錯誤;

5、伺服器主機關機

同;

TCP伺服器 客戶端程式

server tcpserver.cpp檔案 include common initsock.h include cinitsock initsock 初始化winsock庫 int main 填充sockaddr in結構 sockaddr in sin sin.sin family af ine...

TCP伺服器與客戶端的建立

基於tcp 伺服器 1.建立乙個socket,用函式socket 2.繫結ip位址 埠等資訊到socket上,用函式bind 3.設定允許的最大連線數,用函式listen 4.接收客戶端上來的連線,用函式accept 5.收發資料,用函式send 和recv 或者read 和write 6.關閉網路...

TCP伺服器與客戶端的實現

在實現tcp伺服器之前,我們需要了解一下網路程式設計中基礎的幾個概念。套接字 要實現網路上兩台主機之間的資訊傳輸,就像茫茫人海中兩個人見面約會一樣。第一步是要幹什麼呢?當然是要認出對方才是你要找的人,不然認錯了人跟陌生人約會,那可就麻煩大了。對於我們人類來說,熟人可以通過相貌 穿著等判斷,而如果你要...