connect函数出错?

首先简单回忆一下connect函数的原型

#include <sys/socket.h>

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

返回值:成功返回0,出错返回-1

参数:

第一个参数sockfd为调用socket函数返回的套接字文件描述符,第二个,第三个参数分别是一个指向通用套接字结构体的指针和该结构体的大小


小说明1:

调用connect函数前不必非得调用bind函数,当tcp客户端程序没有调用bind函数而调用connect函数时,内核将会根据所用外出网络接口来选择源ip地址,而所用外出接口则取决于到达服务器所需的路径。调用connect函数时会触发tcp三握手。


出错:

扫描二维码关注公众号,回复: 1139394 查看本文章

        <1>.当TCP客户端发出SYN分节却没有收到服务器对客户端SYN分节的响应,等待6s后会再发送一个,若还是没有响应,则再次等待24s后再发送一个,若总共等待了75s后仍未收到响应,则connect返回ETTIMEOUT错误。

<2>.若服务器对客户端的响应是RST(复位),则表明客户端指定连接的服务器主机在该端口上没有进程在等待与之连接(例如服务器进程还没运行),这时connect函数返回ECONNREFUSED错误。

 <3>.若客户发出的SYN分节在中间的某个路由器引发了也一个"destination unreachable"的ICMP错误。客户主机内核保存该消息,并按照第一种情况继续发送SYN,若75s后仍然没有响应,则connect返回EHOSTUNREACH(该错误表示按照本地系统缓存路由表转发表根本没有到达远程服务器的路径)或者ENETUNREACH(connect函数调用根本不等待就返回)

小说明2:connect函数调用失败以后,传入connect函数的套接字不再可用,如果想再次调用connect函数,则必须关闭该套接字,再次调用socket函数创建新的套接字

猜你喜欢

转载自blog.csdn.net/gt1025814447/article/details/79083839