⟅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
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值