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

2021-06-26 14:48:52 字數 3156 閱讀 1689

前言

前面專題的例子都是基於應用層上的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 btnstartmonitor_click(object sender, eventargs e)

/// /// 接受請求

///

private void acceptclientconnect()

}catch

}

客戶端連線服務端方法:

/// /// 連線伺服器

///

///

///

private void btnconnect_click(object sender, eventargs e)

/// /// 連線伺服器

///

private void connecttoserver()

ipaddress ip = ipaddress.parse(txtipaddress.text);

_tcpclient = new tcpclient();

_tcpclient.connect(ip, int.parse(txtport.text));

//延時操作

thread.sleep(1000);

if (_tcpclient != null)

}catch

}

客戶端傳送訊息方法:

/// /// 傳送

///

///

///

private void btnsend_click(object sender, eventargs e)

/// /// 傳送訊息

///

/// 訊息

private void sendmessage(object message)

catch

if (_writer != null)

if (_tcpclient != null)

statusstripinfo.invoke(_showstatuscallback, "斷開了連線");}}

效果圖:

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,再執行...