網路程式設計 TCP

2021-08-15 13:10:54 字數 2734 閱讀 9433

網路程式設計的傳輸層協議一般分為udp和tcp

其中tcp協議是面向連線的,可靠的,流式服務的協議。簡而言之就是安全性完整性更高的,但效率低於udp的協議。

本文將重點涉及linux下具體的採取tcp協議的網路程式設計**實現。

首先最基本的要有兩份**,即伺服器端和客戶端各乙份。

伺服器端程式設計流程如下:

1.首先要建立乙個套接字socket,其本質為檔案描述符

int  socket(int domain,int type,int protocol);

domain: 協議簇   巨集

pf_inet  表示tcp ipv4的協議簇,其的值與位址簇af_inet相等

type:  選擇的協議    巨集

sock_stream表示流式,即tcp的

protocol  前兩個引數的構成下選擇具體的協議,一般寫0表示取預設

最後成功返回描述符,失敗返回-1

2.

由於第一步中只是對socket進行協議族選擇,並未指定位址族。

因此要使用bind函式

將 伺服器的ip

位址和埠號  與  建立的

socket

繫結起來。

int  bind(int sockfd,struct sockaddr *addr,int addrlen);

sockfd:表示第一步sockfd函式的返回值,即sock描述符

第二個引數是乙個結構體指標,這結構體存放的是位址簇協議和socket位址值,但由於這個結構體總不能滿足我們需求,因此我們用了linux下的新定義的結構體,如下

struct sockaddr_in

struct in_addr

因此這個函式的第二個引數要強轉成

struct sockaddr_in*型別。

最後乙個引數表示引數二指向的結構體大小。

成功返回0,失敗返回-1

3.listen

監聽,即建立乙個監聽佇列 

int  listen(int sockfd,int backlog);

backlog:監聽佇列的最大長度。

成功返回0,失敗返回-1

這個並非阻塞函式,只是建立乙個監聽佇列去存放待處理的客戶端連線。

4. accept

從listen建立的監聽佇列中接受連線

int accept(int sockfd,struct sockaddr *addr,int * addrlen); 

返回值:獲取到和客戶連線的檔案描述符,這個描述符才是之後伺服器端收發資料函式會使用到的描述符

addr:用來記錄客戶端的

ip位址和埠號

int * addrlen:是第二引數結構體的長度的位址,注意 bind傳入的是長度,這個是長度的位址

這個函式會阻塞,即監聽的佇列無描述符時阻塞

5.recv/send 收發資料

ssize_t recv(int fd,void *buf,size_t len,int flags)

ssize_t send(int fd,const void *buf,size_t len ,int flags)

第一引數是accept返回的描述

第二個引數是接收/傳送緩衝區位址

第三個是緩衝區長度

第四個引數是一些控制,目前寫0就好

成功返回傳送/接受成功的資料長度,失敗返回-1

6

.close  

關閉連線

int close (int 

fd);

伺服器端要關閉sockfd描述符和accept返回的描述符

客戶端流程:

具體函式實現和伺服器端大同小異,bind這步命名可有可無,因為伺服器端要命名才能讓客戶端識別要鏈結那個埠號,而客戶端就只有自己這個連線,系統會預設分配sock位址的。

1.建立socket

:2.connect  

發起連線

int connect(int sockfd,struct sockaddr*addr,int addrlen);

addr

ip和埠號

3.recv/send 收發資料

4.close關閉連線,因為沒有accept這一步,所以只用關閉sockfd就好

下面演示具體的例子 客戶端傳送資料,伺服器端列印資料和並發給客戶端"i know"資訊,客戶端也列印收到的資訊

伺服器端:

客戶端:

結果:

TCP網路程式設計

基於tcp 通訊模型 由上圖可以得出tcp通訊的步驟如下 服務端 1 建立乙個socket,用函式socket 2 繫結ip位址 埠等資訊到socket上,用函式bind 3 設定允許的最大連線數,用函式listen 4 等待來著客戶端的連線請求,用函式accept 5 收發資料,用函式send 和...

網路程式設計 TCP

客戶端 1.建立客戶端的socket服務,指定目的主機和埠 2.為了傳送資料,應該獲取socket中的輸出流 3.獲取socket中的輸入流來獲取服務端的反饋資料 4.關閉資源 服務端 1.建立服務端的serversocket服務,並監聽乙個埠 2.通過accept方法 等待並獲取連線過來的客戶端s...

網路程式設計 TCP

即有傳送緩衝區 接收緩衝區,傳送次數和接收次數不一定對等。報頭長,成本高,需要搭載更多的資料。1.三次握手 通過對ack的確認,建立可靠連線。有超時重傳機制 2.四次揮手 有可能伺服器處理資料的時間較短,即三次揮手 3.狀態圖 2 保證遲來的資料報能被識別並丟棄 4.tcp狀態轉移過程 5.tcp報...