基本TCP套接字程式設計

2021-08-20 03:51:24 字數 3083 閱讀 4220

tcp客戶與伺服器程序之間典型事件時間表:

socket函式

#includeint socket(int family, int type, int protocol);
family引數執行協議族,該引數也往往被稱為協議域。是以下某個常值:

type引數指明套接字型別,是以下某個常值:

protocol引數應設為下面某個協議型別常值,或者設為0,以選擇所給定family和type組合的系統預設值

socket函式成功時返回乙個非負整數值,與檔案描述符類似,稱為套接字描述符。簡稱sockfd。

connect函式

#includeint connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);    //成功返回0,出錯返回-1
如果是tcp套接字,呼叫connect函式將激發tcp的三路握手過程。

bind函式

bind函式把乙個本地協議位址賦予乙個套接字。協議位址是32位的ipv4位址或128位的ipv6位址。

#includeint bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
通過bind**乙個埠。程序可以把乙個特定的ip位址**到它的套接字上。

對於tcp客戶端,這就為在該套接字上傳送的ip資料報指派了源ip位址。

對於tcp伺服器端,這就限定該套接字只接收那些目的地為這個ip位址的客戶連線。

tcp客戶端通常不把ip位址**到它的套接字上。

listen函式

int listen(int sockfd, int backlog);
listen函式僅由tcp伺服器呼叫:

--當socket函式建立乙個套接字時,它被假設為乙個主動套接字,也就是說,它是乙個將呼叫connect發起連線的客戶套接字。listen函式把乙個未連線的套接字轉換成乙個被動套接字。

--第二個引數規定了核心應該為相應套接字派對的最大連線個數。

監聽套接字的兩個佇列:

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

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

accept函式

accept函式由tcp伺服器呼叫,用於從已完成連線佇列隊頭返回下乙個已完成連線。如果已完成連線隊列為空,那麼程序被投入睡眠。(假設套接字為預設的阻塞)

int accept(int sockfd, struct sockaddr *clntaddr, socklen_t *addrlen);
引數clntaddr和addrlen用來返回已連線的客戶端的協議位址。

accept成功:返回值是核心自動生成的乙個全新描述符,代表與所返回客戶端的tcp連線。

討論accept函式時,稱第乙個引數為監聽套接字描述符,稱它的返回值為已連線套接字描述符。

fork函式和exec函式

fork函式有兩種典型用法:

1.乙個程序建立乙個自身的副本,這樣每個副本都可以在另乙個副本執行其他任何的同時處理各自的某個操作。這是網路伺服器的典型用法。

2.乙個程序想要執行另乙個程式,該程序首先呼叫fork建立乙個自身的副本,然後其中乙個副本(子程序)呼叫exec把自身替換成新的程式。這是諸如shell之類程式的調性用法。

exec函式族詳情見部落格:

exec函式詳解

getsockname 和 getpeername函式

getsockname返回與某個套接字關聯的本地協議位址,getpeername返回與某個套接字關聯的外地協議位址。

#includeint getsockname(int sockfd, struct sockaddr *localaddr, socklen_t *addrlen);

int getpeername(int sockfd, struct sockaddr *peeraddr, socklen_t *addrlen);

這兩個函式的用處:

--在沒有呼叫bind的tcp客戶端上,connect成功返回後,getsockname用於返回由核心賦予該連線的本地ip位址和本地埠號。

--getsockname可用於獲取某個套接字的位址族。

--在乙個以通配ip位址呼叫bind的tco伺服器上,與某個客戶連線一旦建立,getsockname就可以用於返回由核心賦予該連線的本地ip位址。

--當乙個伺服器是由呼叫過accept的某個程序通過呼叫exec執行程式時,能夠獲取客戶身份的唯一途徑便是呼叫getpeername。

例子:獲取套接字的位址族

#include "unp.h"

int sockfd_to_family(int sockfd)

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

基本TCP套接字程式設計

基本tcp套接字程式設計 connect函式 includeint connect int sockfd,const struct sockaddr servaddr,socklen t addrlen 返回 若成功則為0,若出錯則為 1 客戶端呼叫connect前不必非得呼叫bind函式,因為核心...