TCP之connect

Posted Alex

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP之connect相关的知识,希望对你有一定的参考价值。

1. connect函数:

#include <sys/socket.h>

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

ret-成功返回0 失败返回-1

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

 

2. connect不需要bind:

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

 

3. TCP套接字connect错误:

(1) 若TCP客户端没有收到syn分节的响应,则返回ETIMEOUT错误;调用connect函数时,内核发送一个syn,若无响应则等待6s后再发送一个,若仍然无响应则等待24s后在发送一个,若总共等待75s后仍未收到响应则返回本错误;

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

(3) 若客户发送的syn在中间的某个路由器上引发了目的不可达icmp错误,则认为是一种软错误。客户主机内核保存该消息,并按照第一种情况的时间间隔继续发送syn,咋某个规定时间后仍未收到响应,则把保存的消息作为EHOSTUNREACH或者ENETUNREACH错误返回给进程;

 

4. 产生RST三个条件:

(1) 目的地为某端口的syn到达,然而该端口上没有正在监听的服务器;

(2) tcp想取消一个已有连接;

(3) tcp接收到一个根本不存在的连接上的分节;

 

以上是关于TCP之connect的主要内容,如果未能解决你的问题,请参考以下文章

HTTP客户端代码片段

TCP主动打开 之 第一次握手-发送SYN

TCP之种种连接异常

Python 之 Socket编程(TCP/UDP)

异常和TCP通讯

七个办法只有一个有效:200 PORT command successful. Consider using PASV.425 Failed to establish connection.(代码片段