1.套接字是通訊端點的抽象。
與應用程式要用檔案描述符訪問檔案一樣,訪問套接字也需要用套接字描述符。套接字描述符在unix系統是用檔案描述符實現的。
要建立乙個套接字,可以呼叫socket函式。
#include
int socket(int domain,int type,int protocol);//返回值:成功返回檔案(套接字)描述符,出錯返回-1。
a)引數domain確定通訊的特性,包括位址格式。(af_inet,af_inet6,af_unix,af_unspec等)
b)引數type確定套接字的型別,進一步確定通訊特徵。
sock_dgram 長度固定的、無連線的不可靠報文傳遞
sock_raw ip 協議的資料報介面
sock_seqpacket 長度固定、有序、可靠的面向連線報文傳遞
sock_stream 有序、可靠、雙向的面向連線位元組流
c)引數protocol通常是零,表示按給定的域和套接字型別選擇預設協議。
2.shutdown禁止套接字上得輸入/輸出
#include
int shutdown(int sockfd,int how); //返回值:成功返回0,出錯返回-1。
a)如果how是shut_rd,那麼無法從套接字讀取資料;
b)如果how是shut_wr,那麼無法從套接字傳送資料;
c)如果how是shut_rdwr,則將同時無法讀取和傳送資料。
3.將套接字與位址繫結
1)用bind函式將位址繫結到乙個套接字。
#include
int bind(int sockfd,const struct sockaddr *addr,socklen_t len); //成功返回0,出錯返回-1。
2)呼叫函式getsockname來發現繫結到乙個套接字的位址
int getsockname(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp); //成功返回0,出錯返回-1。
alenp為乙個指向整數的指標,該整數指定快取區sockaddr的大小。返回時,該整數會被設定成返回位址的大小。如果該位址和提供的緩衝區長度不匹配,則將其截斷而不報錯。如果當前沒有繫結到該套接字的位址,其結果沒有定義。
3)如果套接字已經和對方連線,呼叫getpeername來找到對方的位址
#include
int getpeername(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict alenp); //成功返回0,出錯返回-1。
除了還會返回對方的位址之外,函式getpeername和getsockname一樣。
4.建立連線
#include
int connect(int sockfd,const struct sockaddr *addr,socklen_t len); //成功返回0,失敗返回-1。
伺服器呼叫listen來宣告可以接受連線請求。
#include
int listen(int sockfd,int backlog); //成功返回0,失敗返回-1。
引數backlog提供了乙個提示,用於表示該程序所要入隊的連線請求數量。其實際值由系統決定,但上限由中somaxconn指定。
一旦伺服器呼叫了listen,套接字就能接收連線請求。使用函式accept獲得連線請求並建立連線。
#include
int accept(int sockfd,struct sockaddr *restrict addr,socklen_t *restrict len); //成功返回檔案(套接字)描述符,出錯返回-1。
函式accept所返回的檔案描述符是套接字描述符,該描述符連線到呼叫connect的客戶端。
如果不關心客戶端標識,可以將引數addr和len設為null;否則,在呼叫accept之前,應將引數addr設為足夠大的緩衝區來存放位址,並將len指向代表這個緩衝區大小的整數的指標。返回時,accept會在緩衝區填充客戶端的位址並且更新指標len所指向的整數為該位址的大小。
如果沒有連線請求等待處理,accept會阻塞知道乙個請求到來。如果sockfd處於非阻塞模式,accept會返回-1並將errno設定為eagain或ewouldblock。
如果伺服器呼叫accept並且當前沒有連線請求,伺服器會阻塞知道乙個請求都來。另外,伺服器可以使用poll或select來等待乙個請求的到來。在這種情況下,乙個等待處理的連線請求套接字會以可讀的方式出現。
網路IPC 套接字
套接字描述符 includeint socket int domain,int type,int prootocol 返回值 若成功,返回檔案 套接字 描述符,若出錯,返回 1域 描述af inet ipv4 網際網路域 af inet6 ipv6網際網路域 af unix unix域 af ups...
UNIX 網路IPC套接字
unix高階環境程式設計 linux秉承著萬物皆檔案的思想,把套接字也弄成了以檔案描述符形式描述的的檔案。1.int socket int domain,int type,int protocol domain分af inet,af inet6,af unix,af upspec 未指定 type分...
APUE 網路IPC 套接字之套接字選項
套接字機制提供兩個套接字選項介面來控制套接字的行為。乙個介面用來設定選項,另乙個介面允許查詢乙個選項的狀態。可以獲取或設定的三種選項 1 通用選項,工作在所有套接字型別上。2 在套接字層次管理的選項,但是依賴於下層協議的支援。3 特定與某協議的選項,為每個協議所獨有。single unix spec...