基本TCP套接字常用函式及引數詳情

2021-10-01 14:17:03 字數 3436 閱讀 8864

1.socket()函式

#include #include int socket(int domain, int type, int protocol);
domain:  協議域

type:       套接字型別

protocol: 某協議型別常值

domain引數的常用值

name

意義af_unix, af_local

unix域協議

af_inet

ipv4網際協議

af_inet6

ipv6網際協議

af_route

路由套接字

af_key

金鑰套接字

type常用值

name

意義sock_stream

位元組流套接字

sock_dgram

資料報套接字

sock_raw

原始套接字

sock_seqpacket

有序分組套接字

socket函式中family與type引數的組合

af_inet 

af_inet6

af_local

af_route 

af_key

sock_stream

tcp|sctp

tcp|sctp

是sock_dgram

udpudp

是sock_seqpacket 

sctp

sctp

是sock_raw

ipv4

ipv6是是

socket成功時返回非負小整數,套接字描述符.

如果失敗了,則返回錯誤碼

error

錯誤原因

eaccess

沒有許可權

eafnosupport

協議不支援位址群

einval

無效引數

emfile

開啟的檔案描述符過多

enfile

檔案表溢位

enobufs

沒有可用的緩衝空間

enomem

記憶體不足

eprotonosupport

不支援的協議

2.connect()函式

int connect(inf socketfd, const struct sockaddr *servaddr, socklen_t addrlen);
如果成功返回0,否則返回-1

用於tcp客戶端連線乙個tcp伺服器端

socketfd:建立的socket描述符

servaddr: 伺服器端的ip

addrlen:    伺服器端ip長度

3.bind()函式

int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
如果成功返回0,否則返回-1

繫結本地協議到乙個套接字

sockfd: 建立的socket套接字

myaddr: 指向特定協議的位址結構指標

這個位址結構myaddr根據位址建立socket時的位址協議族的不同而不同

//ipv4對應的是:

struct sockaddr_in ;

/* internet address. */

struct in_addr ;

//ipv6對應的是: 

struct sockaddr_in6 ;

struct in6_addr ;

//unix域對應的是: 

#define unix_path_max    108

struct sockaddr_un ;

4.listen()函式

int listen(int sockfd, int backlog);
如果成功返回0,否則返回-1

tcp伺服器呼叫,做兩件事

1)將乙個未連線的套接字轉換成乙個被動套接字,指示核心應接受指向該套接字的連線請求

2)該函式第二個引數規定了核心應該為相應套接字排隊的最大連線個數

核心為任何乙個給定的監聽套接字維護兩個佇列:

1.未完成連線佇列:每個這樣的syn分節對應其中一項:已由某個客戶發出並到達伺服器,而伺服器正在等待完成相應的tcp三路握手過程,這些套接字處於syn_rcvd狀態。

2.已完成連線佇列:每個已完成三路握手過程的客戶對應其中一項。這些套接字處於established狀態。

引數backlog代表這兩個佇列總和的最大長度。

5.accept()函式

int accept(int sockfd, struct sockaddr *cliaddr, socklen_t len);
sockfd:伺服器端監聽socket描述符

cliaddr:返回的連線客戶端的ip結構

len:返回已連線的客戶的ip結構長度

返回值:已連線套接字描述符

如果對客戶端的ip位址不感興趣,可以將第二個和第三個引數設定為null

6.fork()函式

#include pid_t fork(void);
子程序返回0,父程序返回子程序id,如果出錯返回-1

父程序中呼叫fork之前開啟的所有描述符在fork返回之後,由子程序分享。

所以accept函式:父程序在呼叫accept之後,呼叫fork,所接受的已連線套接字隨後就在父程序與子程序之間共享了。

通常,子程序接著讀寫這個已連線的套接字,父程序則關閉這個已經連線的套接字。

fork兩個經典用法:

1)乙個程序建立乙個自身的副本,這樣每個副本都可以在另乙個副本執行其他任務的同時,處理各自操作。

2)乙個程序想要執行另乙個程式。既然建立新程序的唯一辦法是呼叫fork,該程序把自身替換成新的程式。

7.close()函式

#include int close(int sockfd);
關閉套接字描述符

close乙個tcp socket的預設行為時把該socket標記為以關閉,然後立即返回到呼叫程序。該描述字不能再由呼叫程序使用,也就是說不能再作為read或write的第乙個引數。

注意:close操作只是使相應socket描述字的引用計數-1,只有當引用計數為0的時候,才會觸發tcp客戶端向伺服器傳送終止連線請求。

如果我們確實想在某個tcp連線上傳送乙個fin,那麼可以改用shutdown()函式來替代close()函式。

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

使用套接字進行tcp應用程式設計十分 方便,因為unix linux的設計是清晰分層的,應用層只需要使用套接字的介面api函式,具體的實現是由核心來做的,而核心只負責底層 實現,並不關心應用層邏輯,好處多多,下面就分析小結下tcp套接字的常用函式 1.socket 函式 為了進行網路i o,第一件事...

基本TCP套接字程式設計

基本tcp客戶 伺服器程式的套接字函式 返回 若成功則為非負描述符,若則為 1 其中family引數指明協議族,為某個常值。該引數也往往稱為協議域。family 說明af inet ipv4協議 af inet6 ipv6協議 af local unix域協議 af route 路由套接字 af k...

基本TCP套接字程式設計

經過最近一段時間的系統學習,對於傳輸協議中tcp協議的套接字程式設計以及11中狀態轉化有了一定的認識,現在做出 以下總結 上圖是幾乎所有教科書上關於tcp客戶端 伺服器通訊過程中api函式的彙總。首先看伺服器端 1 服務端以被動連線的方式參與通訊,因此首先呼叫socket int family,in...