使用套接字進行tcp應用程式設計十分 方便,因為unix/linux的設計是清晰分層的,應用層只需要使用套接字的介面api函式,具體的實現是由核心來做的,而核心只負責底層 實現,並不關心應用層邏輯,好處多多,下面就分析小結下tcp套接字的常用函式:
1. socket 函式
為了進行網路i/o,第一件事情就是呼叫socket函式。
原型:
#include int socket(int family, int type, int protocol);
引數: family 協議族 af_inet(ipv4協議) af_inet6....
typed 套接字型別
sock_stream 位元組流套接字(常見)
sock_dgram 資料報套接字
sock_seqpacket 有序分組套接字
sock_raw 原始套接字
protocol 具體的協議
ipproto_tcp tcp傳輸協議
ipproto_udp udp傳輸協議
ipproto_sctp sctp傳輸協議
返回: 成功則分會乙個小的非負整數值,類似於乙個檔案描述符,我們把它
稱為套接字描述符(sicket descriptor),簡稱sockfd,
失敗則返回 -1
舉例:進行tcp的客戶端、伺服器通訊,
sockfd = socket(af_inet, sock_stream, 0)
客戶端呼叫: sockfd = socket(af_inet, sock_stream, 0);
伺服器端呼叫:sockfd = socket(af_inet, sock_stream, 0);
2. connect 函式
tcp客戶用connect函式來建立與tcp伺服器的連線,假設tcp通訊,呼叫該函式後,將會觸發
三次握手過程。
原型:
#include int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
引數: sockfd 套接字描述符,socket函式的成功返回值。
servaddr 套接字位址指標,實際使用的時候 應該是 sockaddr_t,再進行
強制轉換
addrlen 套接字位址結構體的大小。
返回:只有連線成功或連線失敗才會返回。
舉例:客戶端通過tcp與伺服器建立連線:
connect(sockfd, (struct sockaddr *)&remote_addr, sizeof(struct sockaddr));
3. bind 函式
該函式把乙個本地的協議位址賦值給乙個套接字,tcp的伺服器必須要使用該函式,本質上tcp客戶端,也是要使用bind函式的,只不過因為核心為這個套接字選擇了乙個臨時的埠,所以我們很少看到客戶端使用bind函式。bind相當於要將乙個本地定義好的協議位址(ip位址、埠等資料)繫結到乙個socket中,socket雖然是乙個結構體,可以含有這些資訊,但是還是需要通過bind來進一步繫結實現的。而伺服器需要要通過固定埠來實現接收,所以伺服器需要使用bind函式。
原型:
#include int bind(int sockfd, const sockaddr *myaddr, socklen_t addrlen);
引數: sockfd 套接字描述符,socket函式的成功返回值。
servaddr 套接字位址指標,實際使用的時候 應該是 sockaddr_t,再進行
強制轉換
addrlen 套接字位址結構體的大小。
4. listen 函式
描述:該函式僅由tcp伺服器呼叫,它做兩件事
1)當socket函式建立乙個套接字時,它被假設為乙個主動的套接字,也就是說,它是乙個將要呼叫connect發起連線的客戶套接字,listen函式把乙個未連線的套接字轉換成乙個被動套接字,指示核心應接受指向該套接字的連線請求。呼叫該函式,將調至套接字從closed狀態轉換到listen狀態。
2)該函式的第2個引數規定了核心應該為相應的套接字排隊的最大連線個數。
listen函式通常應該在socket和bind這2個函式之後,並在accept函式之前。
原型:
#include int listen(int sockfd, int backlog);
引數: sockfd 套接字描述符,socket函式的成功返回值。
backlog 最大連線個數,包含已經三次握手連線成功的客戶端 + 正在連線的客戶端。
返回: 失敗返回 -1
注意:該函式不需要放到主迴圈裡,我們可以簡單理解成,核心已經幫我們做了迴圈執行,移值等待監聽新的客戶端連線,通過保證最大連線數不超過backlog。
5. accept 函式
原型:
#include int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);引數: sockfd 套接字描述符,socket函式的成功返回值。也就是伺服器自己的套接字。
cliaddr 取出的已經連線的套接字 協議位址,也就是對應客戶端的協議位址。
addrlen 取出的已連線的套接字 的長度。
TCP套接字程式設計
網路程式設計又稱為套接字程式設計,為了與遠端計算機進行資料傳輸,需要連線到網際網路,而程式設計中的 套接字 就是用來連線該網路的工具。它本身具有連線的含義,還可以表示為兩台計算機之間的網路連線。4.呼叫accept函式受理連線請求 基於tcp的服務端 客戶端 tcp伺服器端預設函式呼叫順序 sock...
TCP套接字程式設計
對於socket不理解的可以檢視 c語言通過socket程式設計實現tcp通訊,linux socket程式設計 socket詳解 先看看程式效果圖 提示如果伺服器,直接通過ctrl z關閉,這樣程式占用的位址不會釋放,需要以下操作 1.ps 檢視程序 2.kill 9 程式pid 強制殺死程序 服...
TCP套接字程式設計!!!
一 socket程式設計的基本函式詳解,其中根據客戶端還是服務端,或者根據使用tcp還是udp,函式的呼叫流程有些許區別 1 socket 函式用於建立乙個套接字,一條通訊線路的端點。3 listen 在服務端程式成功建立套接字和與位址進行繫結之後,還需要準備在該套接字上接收新的連線請求。此時呼叫l...