基本TCP套介面的程式設計流程

2021-10-10 03:49:41 字數 3182 閱讀 3564

要實現客戶端和伺服器端的通訊,則需要客戶端和伺服器端共同完成。其中,tcp伺服器和客戶端的程式設計流程如圖所示:

首先由伺服器端建立socket,然後bind繫結通訊埠,建立listen監聽佇列。之後便開始了通訊的過程。此時伺服器阻塞在accept這裡,直到tcp客戶端主動進行connect進行三次握手建立連線。此時客戶端的write函式向伺服器傳送請求,伺服器端read來讀取請求,並且進行處理。處理完成之後呼叫伺服器端的write函式給客戶端傳送應答報文,客戶端則通過read來接受回應資訊。至此整個資料交換結束,客戶端可以主動關閉。

其中family通常在ipv4協議下下是af_inet,ipv6協議下是af_inet6。type在tcp傳輸協議下是sock_stream,udp協議下是sock_dgram.一般來說,函式socket的引數protocol設定為0,除非用在原始套介面上

tcp客戶端用connect函式來和tcp伺服器建立連線。

sockfd是socket函式的返回值。第二個引數是指向套介面位址結構體的指標,第三個引數是結構體的大小。

sin_port是埠號,s_addr是伺服器網路ip位址。通過這段程式,客戶端即可連線到客戶端的埠和ip上,也就是建立鏈結。

bind給套介面分配乙個本地協議位址,對於網路協議,協議位址是32位ipv4位址或者128位ipv6位址。

第乙個引數是socket函式的返回值,第二個和第三個同connect函式中所描述的。

建立兩個套介面物件,乙個是面向伺服器,乙個面向客戶端。

listen僅僅被tcp伺服器呼叫,主要完成兩個功能:

backlog指的是最大鏈結個數。對於乙個給定的監聽套介面,核心要維護兩個佇列:

1.以完成鏈結佇列

2.未完成連線佇列

backlog之前一直被定義為兩個佇列總和的最大值。通常試驗環境下,將backlog設定成5。但是對於現代伺服器來說是遠遠不夠的。記住backlog不能設定成0,這會導致程式發生缺陷。如果不想要其他人來鏈結,要關閉此埠。

accept由伺服器呼叫,用來鏈結客戶端傳送的connect請求,由此建立通過三次揮手建立連線。

請注意,如果accept執行成功,返回值是乙個由核心自動生成的全新描述符,代表和客戶端的tcp鏈結。這個描述符稱之為已連線套接字,而把socket函式的返回值稱之為監聽套接字。乙個監聽套接字sockfd往往在伺服器程式中只生成乙個,並且一直存在。而已連線套接字c代表著客戶端和伺服器完成了三次握手,當客戶端斷開時,則關閉c套接字。

當然,如果c<0,則代表已經建立鏈結失敗,則會阻塞一直等待客戶端去鏈結。

write和read是兩種狀態,分別代表處理資料和接收資料。舉個例子,在程式進行通訊的時候,通常write由send系統呼叫來表示,而read通常通過recv系統呼叫來表示。

客戶端的send和recv:

伺服器端的send和recv:

至此,tcp套介面的程式設計流程就基本結束,只需要關閉掉套接字描述符即可。

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

printf

("accept c=%d\n"

,c);

//鏈結套接子

while(1

);int n=

recv

(c,buff,

127,0)

;//如果對方關閉了傳送,recv返回0;-1是失敗

if(n<=0)

printf

("buff=%s\n"

,buff)

;send

(c,"ok",2

,0);

}close

(c);

}}

客戶端源**:

#include

#include

#include

#include

#include

#include

#include

#include

intmain()

;printf

("input:\n");

fgets

(buff,

128,

stdin);

if(strncmp

(buff,

"end",3

)==0)

send

(sockfd,buff,

strlen

(buff),0

);memset

(buff,0,

128)

;recv

(sockfd,buff,

128,0)

;printf

("buff=%s\n"

,buff);}

exit(0);}

TCP套介面程式設計 Socket

tcp套介面程式設計 socket socket起源於unix,而unix linux基本哲學之一就是 一切皆檔案 都可以用 開啟open 讀寫write read 關閉close 模式來操作。我的理解就是socket就是該模式的乙個實現,socket即是一種特殊的檔案,一些socket函式就是對其...

套介面程式設計

1 struct in addr 4struct sockaddr in 通用套介面位址結構 struct sockaddr int bind int struct sockaddr socklen t strcut sockaddr in serv bind sockfd,struct socka...

套介面程式設計

1 struct in addr 4struct sockaddr in struct sockaddr int bind int struct sockaddr socklen t strcut sockaddr in serv bind sockfd,struct sockaddr serv,s...