C 網路程式設計系列 專題五 TCP程式設計

2021-09-04 17:13:40 字數 3442 閱讀 1013

前言

前面專題的例子都是基於應用層上的http協議的介紹, 現在本專題來介紹下傳輸層協議——tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。

一、tcp的工作過程

首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可以分為三個階段:一、連線的建立; 二、傳輸資料; 三、斷開連線,下面就對這三個過程分別介紹下:

1.1 連線的建立

tcp的連線建立就像打**一樣, 我們打**時,撥乙個號碼的號碼並不是立即就可以接通的,期間會有乙個「嘟 嘟」的呼叫過程, 這就好比是tcp協議的連線的建立階段。當我們用tcp編寫的程式,必須先建立tcp連線。tcp協議的連線建立通過三次握手來完成的,下面是在網上找的一張tcp三次握手的:

下面就對這三次握手簡單的介紹:

第一次握手:建立連線時,客戶端傳送syn包(seq=x)到伺服器,並進入syn_send狀態,等待伺服器確認

第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=x+1),同時自己也傳送乙個syn包(seq=y),即syn+ack包,此時伺服器進入syn_recv狀態

第三次握手:客戶端收到伺服器的syn+ack包,向伺服器傳送確認包ack(ack=y+1),此包傳送完畢,客戶端和伺服器進入established(建立)狀態,完成三次握手。

簡單理解三次握手就是傳送乙個檢驗包給對方然後互相確認,雙方都接到確認的乙個訊號時,這時候雙方就建立了連線(就像我們打**時,如果沒人說話時就會說下 「喂」,說這句「喂」 也就是希望得到對方的乙個確認,雖然這裡雙方已經建立了連線的,這裡只是更形象的說明下三次握手的過程)。

1.2 傳輸資料

雙方建立了連線,即在雙方建立了乙個通訊通道(就像一座橋一樣,在兩端建立了乙個通路,用橋來比喻通訊通道主要是因為最近有一則新聞:哈爾濱陽明灘大橋坍塌事件),建立連線之後,當然是傳輸我們需要傳輸的資料到對方的,這裡就開始簡單介紹下傳輸資料的過程。

利用tcp傳輸資料時,資料是以位元組流的形式進行傳輸,客戶端與伺服器端建立連線後,傳送方需要先將傳送的資料轉換為位元組流,然後將其傳送給對方,傳送資料時,可以通過程式不斷地將資料流陸續寫入tcp的傳送緩衝中,然後tcp自動從傳送緩衝中提取一定量的資料,將其組成tcp報文段傳送到ip層,再通過ip層(也就是網路層)之下的網路介面傳送出去;接受端從ip層接收到tcp報文段後,將其暫時儲存在接受緩衝中,然後我們通過程式依次讀取接受緩衝中的資料,從而達到相互通訊的目的(簡單的說就傳送方把資料轉換為資料流,再把資料流儲存在傳送緩衝中,然後傳輸層低層的協議從傳送緩衝中讀取資料把資料傳送出去,然後接收端從底層接受到資料把資料儲存在接收端的緩衝中,然後我們寫的程式只是從緩衝中依次讀取資料,然後顯示出來,在客戶端我們寫**做的事情是把資料寫入write寫入傳送端的緩衝中,然後伺服器端(接收端)用read方法在自己的緩衝中讀取資料,用一句話概括,tcp的傳輸就是對資料的寫——讀操作)括號中的內容只是我個人理解,因為這樣我感覺理解起來比較容易,對於剛開始接觸tcp的朋友可以這樣理解,然後再一句句話去擴充套件。

1.3 斷開連線

tcp的工作過程就分為上面三個過程,tcp程式設計是作為上層應用程式設計的基礎,就像之前專題中基於http協議的web伺服器,web瀏覽器,其傳輸層都用的是tcp協議進行傳輸的,還有基於ftp(檔案傳輸協議),imap(互動式郵件訪問協議) pop3(郵局協議的第3個版本) 和smtp(簡單郵件傳輸協議)的網路應用其傳輸層都用的是tcp協議,而不是udp等其他傳輸層協議。

二、基於tcp協議的簡單通訊程式

這裡簡單實現了乙個客戶端與伺服器間的通訊程式,核心**為:

客戶端連線伺服器端**:

private

void btnconnect_click(object

sender, eventargs e)

//連線伺服器方法,建立連線的過程

private

void

connecttoserver()

ipaddress ipaddress =ipaddress.parse(tbxserverip.text);

tcpclient = new

tcpclient();

tcpclient.connect(ipaddress,

int.parse(tbxport.text));

//延時操作

thread.sleep(1000

);

if (tcpclient != null

)

}catch

}

客戶端傳送訊息的**:

//

傳送訊息

private

void btnsend_click(object

sender, eventargs e)

private

void sendmessage(object

state)

catch

if (writer != null

)

if (tcpclient != null

)

statusstripinfo.invoke(showstatuscallback,

"斷開了連線");}}

伺服器端接受開始監聽客戶端請求的**:

//

開始監聽

private

void btnstart_click(object

sender, eventargs e)

//接受請求

private

void

acceptclientconnect()

}catch

}

現在看看執行的結果:

首先先啟動伺服器然後點開始監聽,此時執行緒會堵塞,直到接受到乙個連線請求位置

通過接受按鈕和傳送按鈕來實現雙方的通訊,實現介面如下:

三、總結

C 網路程式設計系列 專題五 TCP程式設計

前言 前面專題的例子都是基於應用層上的http協議的介紹,現在本專題來介紹下傳輸層協議 tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。一 tcp的工作過程 首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可...

C 網路程式設計系列 專題五 TCP程式設計

前言 前面專題的例子都是基於應用層上的http協議的介紹,現在本專題來介紹下傳輸層協議 tcp協議,主要介紹下tcp協議的工作過程和基於tcp協議的乙個簡單的通訊程式,下面就開始本專題的正文了。一 tcp的工作過程 首先tcp是一種面向連線的,可靠的,基於位元組流的傳輸層通訊協議。tcp的工作過程可...

c 網路程式設計之TCP

此專案的目的是分別編寫tcp的客戶端和服務端程式並為兩者建立通訊,客戶端收到從服務端傳送的服務端本地時間。此專案在dev c 5.11下開發,需要用到的庫有winsock2.h,以及靜態鏈結檔案wsock32.lib。需要分別建立兩個專案server和client,先執行server.cpp,再執行...