说在前面
- 环境: ubuntu16.04
- 参考: UNIX网络编程、linux manual page
数据类型说明
数据类型 | 说明 | 头文件 |
socklen_t | 套接字地址结构的长度,一般为uint32_t | <sys/socket.h> |
基本说明
TCP客户用connect函数来建立与TCP服务器的连接。
-
定义
#include <sys/socket.h> int connect(int sockfd, const struct sockaddr *servvaddr, socklen_t addrlen);
参数说明:
- sockfd
套接字描述符 - servaddr
指向套接字地址结构的指针 - addrlen
套接字地址结构的长度
注意:connect返回失败则该套接字不再可用,必须关闭,我们不能对这样的套接字再次调用connect函数。若再失败后想要重新连接,需要重新调用socket函数。
- sockfd
-
说明
- 客户(端)在调用函数connect前不必非得调用bind函数;若调用bind,则会确定发送的IP数据报的源IP地址,并选择一个临时端口作为源端口(不一定要内核选择临时端口,bind可以指定端口,见bind函数)
- 在TCP套接字前提下,调用connect函数将激发TCP三路握手,并且函数仅在连接建立成功或者出错时才返回;出错类型如下:
- 若TCP未收到SYN分节的响应(如下图SYN k,ACK j+1),则返回ETIMEOUT错误。举个栗子,在4.4BSD系统中,调用connect函数时,内核发送SYN,若无响应则等待6秒重发SYN;若仍然无响应则等待24秒重发SYN。若等待总计75秒后仍无响应则返回ETIMEOUT(time out)错误。
- 若服务器对客户(端)的SYN的响应是RST(reset,复位),则表明该服务器在我们指定的端口上没有进程在等待连接。此时,connect返回ECONNREFUSED(conn refused)错误。该种错误是一种硬错误(hard error)。
RST是TCP在发生错误时发送的一种TCP分节(包)。 - 若客户发送的SYN在中间某个路由器上引发了一个“destination unreachable” ICMP错误,则被认为是一种软错误(soft error)。客户主机内核保存该消息(上述ICMP错误),并按照第一种情况重发SYN。若最后还是未收到响应,则将该消息作为EHOSTUNREACH(host unreach)或ENETUNREACH(net unreach)错误返回给进程。
下列情形也可能出现该错误:按照本地系统的转发表,没有到达远程系统的路径;connect调用不等待就返回。
查看返回错误
使用getdaytime栗子中的client进行测试。
- 连接本地子网中不存在的主机(选个不存在的IP)
等待时间挺长的 - 连接本地子网中不存在获取时间服务器的主机(可以进路由器看看有哪些已分配的IP)
比较快就返回了 - 把网络连接关闭,连接非本地IP