網路程式設計的傳輸層協議一般分為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報...