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三握手。


出错:

        <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函数创建新的套接字

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值