客户端的连接函数connect函数

TCP客户用connect函数来建立于TCP服务器端的连接

#include<sys/socket.h>

int connect(int sockfd, const struct sockaddr *servaddr, int *addrlen);

                                    返回:若成功则返回0,失败则返回-1;

    sockfd是有socket函数返回的套接字描述符,第二个、第三个参数分别是一个指向套接字地址结构的指针和该结构的大小。套接字地址结构必须含有服务器的IP地址和端口号。

    客户在调用函数connect之前不必非得调用bind函数,因为需要的话,内核会确定源IP地址,并选择一个临时端口为源端口。

    如果是TCP套接字,调用connect函数将激发TCP的三路握手过程,而且仅在连接建立成功时或出错时才返回,其中出错返回可能有以下几种情况。

    (1)若TCP客户端没有收到SYN分节的响应,则返回ETIMEDOUT错误。举例来说,调用connect函数时,4.4BSD内核发送一个SYN,若无响应则等待6s后再发送一个,若仍无响应则等待24s后再发送一个。若总共等了75s后仍未收到响应则返回本错误。

    (2)若对客户的SYN的响应是RST(表示复位),则表明该服务器在我们指定的端口上没有进程在等待与之连接。这是一种硬错误,客户一接收到RST就马上返回ECONNREFUSED错误。

        RST是TCP在发生错误时发送的一种TCP分节。产生RST的三个条件是:目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器;TCP想取消一个连接;TCP接受到一个根本不存在的连接上的分节。

    (3)若客户发出的SYN在中间的某个路由器上引发了一个“destination unreachable”(目的地不可达)ICMP错误,则认为是一种软错误。客户主机内核保存该消息,并按上述第一种情况中所述的时间间隔继续发送SYN。若在某个规定时间(4.4BSD规定的75s)后仍未收到响应,则把保存的消息(即ICMP错误)作为“EHOSTUNREACH”或“ENETUNREACH”错误返回给进程。以下两种情况也是有可能的:一是按照本地系统的转发表,根本没有到达远程系统的路径;二是connect调用根本不等待就返回。

    按照TCP状态转换图,connect函数导致当前套接字从CLOSED状态转移到SYN_SENT状态,若成功则再转移到ESTABLISHED状态。若connect失败则该套接字不可再用,必须关闭,我们不能对这样的套接字再次调用connect函数。当循环调用函数connect为给定主机尝试各个IP地址直到有一个成功时,在每次connect失败后,都必须close当前的套接字描述符重新调用socket。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值