基本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);作用:將套介面坐上“已關閉”標記,並立即返回到進程;