《UNIX網路程式設計》卷一第四章學習筆記

2021-10-07 22:35:15 字數 2677 閱讀 1510

#includeint socket(int family,int type,int protocol);

//返回值:出錯返回-1,否則返回非負描述符

famliy引數指明協議族:

取值含義

af_inet

ipv4協議

af_inet6

ipv6協議

af_local

unix域協議

af_route

路由套接字

af_key

金鑰套接字

type引數指明套接字型別:

取值含義

sock_stream

位元組流套接字

sock_dgram

資料報套接字

sock_seqpacket

有序分組套接字

sock_raw

原始套接字

protocol引數指定傳輸協議:

取值含義

ipproto_tcp

tcp傳輸協議

ipproto_udp

udp傳輸協議

ipproto_sctp

sctp傳輸協議

0給定famliy和type組合的系統預設值

#includeint connect(int sockfd,const struct sockaddr *servaddr,socklen_t addrlen);

//返回值 成功返回0,出錯返回-1

sockfd是由socket函式返回的套接字描述符,後兩個引數分別是乙個指向套接字位址結構的指標和該結構的大小。套接字位址結構必須含有伺服器的ip位址和埠號。

#includeint bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);

//返回值 成功返回0,出錯返回-1

bind函式把乙個本地協議賦予乙個套接字。引數和connect是一樣的,但後兩個可以都指定,也可以指定乙個,也可以不指定。不指定的引數由核心進行配置。

#includeint listen(int sockfd,int backlog);

//成功返回0,出錯返回-1

listen函式僅由tcp伺服器呼叫,它做兩件事情。

1)當socket函式建立乙個套接字時,它被假設為乙個主動套接字,也就是說,它是乙個將呼叫connect發起連線的客戶套接字。listen函式把乙個未連線的套接字轉換成乙個被動套接字,指示核心應接受指向該套接字的連線請求。

2)listen函式第二個引數規定了核心應為相應套接字排隊的最大連線個數(也許實際會更大一些)。

本函式通常在socket和bind後accept前被呼叫。

#includeint accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen);

//成功返回非負描述符,出錯返回-1

addrlen是值-結果引數:呼叫前將指標對應值為cliaddr位址結構的長度,返回時,指標對應值被修改為核心存放在該套接字位址結構內的確切位元組數。

要區分accept函式返回的已連線套接字描述符和它的第乙個引數監聽套接字描述符。乙個伺服器通常僅僅建立乙個監聽套接字,它在該伺服器的生命期內一直存在。核心為每個由伺服器程序接受的客戶連線建立乙個已連線套接字,當伺服器完成對某個給定使用者的服務時,相應的已連線套接字就被關閉。

如果對連線者的ip、埠號不感興趣,accept函式的後兩個引數可置為null。但好像不能只設定乙個,否則會有一些問題。

#includeint close(int sockfd);

//成功返回0,出錯返回-1

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

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

//成功返回0,出錯返回-1

通俗地講,這兩個函式的作用就是就是在第二個引數指向的套接字位址結構中填充本機ip地、址伺服器程序所用埠號和位址族。顧名思義,getsockname自然就是返回自己這邊的位址結構,getpeername則是返回對面的。

第乙個函式,我覺得似乎沒啥用……不過陣列書中給出了getpeername的應用場景,看後覺得很有道理,複述如下:

當乙個伺服器是由呼叫1過accept的某個程序通過呼叫exec執行程式時,它能夠獲取客戶身份的唯一途徑便是呼叫getpeername。inetd fork並exec某個tcp伺服器程式時就是如此情形。……inetd隨後呼叫fork,派生除inetd的乙個子程序。既然子程序起始於父程序記憶體映象的乙個副本,父程序中的那個套接字地質結構在子程序中也可用,那個已連線的描述符也是如此。然而當子程序呼叫exec執行真正的伺服器程式時,子程序的記憶體映像被替換成新的伺服器程式檔案(也就是說包含對端位址的那個套接字位址結構就此丟失),不過那個已連線套接字描述符跨exec繼續保持開放。伺服器程式首先呼叫的函式之一便是getpeername,用於獲取使用者的ip位址和埠號。

Unix網路程式設計筆記 第四章

tcp時間服務 server.c include include include include include include include include include include define bzero ptr n memset ptr,0,n define maxline 4096...

TCP IP卷一(第四章學習)

arp 位址解析協議 當一台主機把乙太網資料幀傳送到位於同意區域網上的另一台主機時,是根據48bit的乙太網位址來確定目的介面。裝置驅動程式從不檢查ip資料報中的目的ip位址。舉例說明arp 當我們敲入 ftp bsdi 這個命令,會進行以下步驟 1 應用程式ftp客戶端呼叫函式gethostbyn...

第四章 程式設計

選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...