⟅UNIX网络编程⟆⦔connect函数

说在前面

数据类型说明

数据类型 说明 头文件
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函数

  • 说明

    • 客户(端)在调用函数connect前不必非得调用bind函数;若调用bind,则会确定发送的IP数据报的源IP地址,并选择一个临时端口作为源端口(不一定要内核选择临时端口,bind可以指定端口,见bind函数
    • 在TCP套接字前提下,调用connect函数将激发TCP三路握手,并且函数仅在连接建立成功或者出错时才返回;出错类型如下:
    1. 若TCP未收到SYN分节的响应(如下图SYN k,ACK j+1),则返回ETIMEOUT错误。举个栗子,在4.4BSD系统中,调用connect函数时,内核发送SYN,若无响应则等待6秒重发SYN;若仍然无响应则等待24秒重发SYN。若等待总计75秒后仍无响应则返回ETIMEOUT(time out)错误。
      在这里插入图片描述
    2. 若服务器对客户(端)的SYN的响应是RST(reset,复位),则表明该服务器在我们指定的端口上没有进程在等待连接。此时,connect返回ECONNREFUSED(conn refused)错误。该种错误是一种硬错误(hard error)。
      RST是TCP在发生错误时发送的一种TCP分节(包)。
    3. 若客户发送的SYN在中间某个路由器上引发了一个“destination unreachable” ICMP错误,则被认为是一种软错误(soft error)。客户主机内核保存该消息(上述ICMP错误),并按照第一种情况重发SYN。若最后还是未收到响应,则将该消息作为EHOSTUNREACH(host unreach)或ENETUNREACH(net unreach)错误返回给进程。
      下列情形也可能出现该错误:按照本地系统的转发表,没有到达远程系统的路径;connect调用不等待就返回。

查看返回错误

使用getdaytime栗子中的client进行测试。

  • 连接本地子网中不存在的主机(选个不存在的IP)
    在这里插入图片描述
    等待时间挺长的
  • 连接本地子网中不存在获取时间服务器的主机(可以进路由器看看有哪些已分配的IP)
    在这里插入图片描述
    比较快就返回了
  • 把网络连接关闭,连接非本地IP
    在这里插入图片描述
发布了106 篇原创文章 · 获赞 41 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_33446100/article/details/103476912