基本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状态;