要實現客戶端和伺服器端的通訊,則需要客戶端和伺服器端共同完成。其中,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...