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...