TCP套接字程式設計 常用函式小結

2021-09-18 05:55:29 字數 2680 閱讀 8257

使用套接字進行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...