unix網絡編程常用函數詳解



基本TCP客戶-服務器程序的套接口函數如下圖:

1、socket函數

原型:#include<sys/socket.h>

int socket(int family, int type, int protocol); 返回值:非負描述符--成功, -1--出錯;

作用:指定期望的通信協議接口(TCP或UDP或unix域字節協議等)

family 指明協議簇

解釋
AF_INET IPv4協議
AF_INET6 IPv6協議
AF_LOCAL Unix與協議
AF_ROUTE 路由套接口
AF_KEY 密鑰套接口
type類型

類型 解釋
SOCK_STREAM 字節流套接口
SOCK_DGRAM 數據包套接口
SOCK_RAW 原始套接口

2、connect函數

原型:#include<sys/socket.h>

int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);返回值:0---成功,-1----出錯;

作用:客戶端用connect 函數建立一個與TCP服務器的連接;

參數:sockfd,套接口描述字;

             servaddr,套接口地址結構的指針,該地址結構需要包含服務器IP地址和端口號;

             addrlen, 套接口地址結構的大小;

關於connect出錯返回的幾種情況:

  •  如果TCP客戶端沒有收到SYN分節的響應,則返回ETIMEDOUT。
  • 如果對客戶的SYN的響應是RST,則表明該服務器主機在我們指定的端口上沒有進程在等待與之連接,這稱之爲硬錯,客戶端接到RST,立即返回錯誤ECONNREFUSED;
  • 如果某客戶端發出的SYN在中間的路由器上引發了一個目的地不可達的ICMP錯誤,這稱之爲軟錯,客戶端按時間間隔繼續發送SYN,在規定時間仍未收到響應,則返回EHOSTUNREACH;
3、bind函數
原型:#include<sys/socket.h>
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);返回值:0---成功,-1----出錯;
作用:給套接口分配一個本地協議地址;
參數:sockfd,套接口描述字;
    myaddr,特定於協議的地址結構的指針,對於TCP,可以指定一個IP地址,一個端口號;
           addrlen,第二個參數地址結構的長度;
4、listen函數
原型:#include<sys/socket.h>
int listen(int sockfd, int backlog);  返回值:0---成功,-1---出錯;
作用 : 將未連接的套接口轉換成被動套接口,指示內核應接受此套接口的連接請求;第二個參數規定了次套接口排隊的最大連接數;
參數:sockfd,套接口描述字;
            backlog,套接口排隊的最大連接數;
對與第二個參數backlog的理解:
  • 未完成連接隊列,爲每個已由客戶端發出併到達服務器,服務器正在等待完成相應TCP三路握手過程的SYN分節開設一個條目,這些套接口都處於SYN_RCVD;
  • 已完成隊列:爲每個已完成TCP三路握手過程的客戶開設一個條目,這些套接口都處於ESTABLISHED狀態;
關係如下圖:

5、accept函數
原型:#include<sys/socket.h>
int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen);返回值:非負描述符---成功,-1----出錯;
作用:有服務器調用,從已完成連接隊列頭返回下一個已完成連接,若已完成連接隊列爲空,則進程睡眠。
參數:sockfd,套接口描述字;
    cliaddr,客戶進程協議地址;
   addrlen,第二個參數,客戶進程協議地址的長度;
6、close函數
原型:#include<unistd.h>
int close(int sockfd);
作用:將套接口坐上“已關閉”標記,並立即返回到進程;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章