基本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 | 密鑰套接口 |
類型 | 解釋 |
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;
- 未完成連接隊列,爲每個已由客戶端發出併到達服務器,服務器正在等待完成相應TCP三路握手過程的SYN分節開設一個條目,這些套接口都處於SYN_RCVD;
- 已完成隊列:爲每個已完成TCP三路握手過程的客戶開設一個條目,這些套接口都處於ESTABLISHED狀態;