connect系统调用

来源:互联网 发布:趴桌子睡觉神器知乎 编辑:程序博客网 时间:2024/06/09 14:59

1.概述
linux网络编程中,一般是客户端调用connect函数,该函数将引起操作系统的tcp协议向远端的服务器执行三次握手的过程,分为两种情况进行说明,一种是connect的第一个参数文件描述符是非阻塞的.一种是该文件描述符是阻塞的.
2.阻塞情况
当该文件描述符是阻塞的时候,那么connect调用也必然是阻塞的,只有当连接上或者连接失败时返回,意味着connect返回时仅有两种情况,已经连接上,返回0,连接失败返回-1.
当connect远端主机处于网络断开的时候,这时候当前主机会向远端主机连续发送8次syn报文,间隔时间1,2,4,8…当超过75秒后,connect返回,errno 被设置为相应值,实验结果如下:
这里写图片描述

这里写图片描述
当远端主机网络连通时,如果主机没有在相应的端口上进行监听,那么该主机将直接返回rst包,connect返回.

这里写图片描述

3 非阻塞情况
当该文件描述符非阻塞的情况下,connect会立即返回,如果为0,表示已经连接上,为-1 表示还未连接上,但如果errno 是EINPROGRESS 那么表示操作系统已经向远端的服务器发起了三次握手.
可以调用select来设置定时器,让其可以在任意小于75秒的时间内完成连接,如果未能完成select返回,进行错误处理.
引用别人的话
“说明:由于程序用select等待连接完成,可以设置一个select等待时间限制,从而缩短connect超时时间。多数实现中,connect的超时时间在75秒到几分钟之间。有时程序希望在等待一定时间内结束,使用非阻塞connect可以防止阻塞75秒,在多线程网络编程中,尤其必要。 例如有一个通过建立线程与其他主机进行socket通信的应用程序,如果建立的线程使用阻塞connect与远程通信,当有几百个线程并发的时候,由于网络延迟而全部阻塞,阻塞的线程不会释放系统的资源,同一时刻阻塞线程超过一定数量时候,系统就不再允许建立新的线程(每个进程由于进程空间的原因能产生的线程有限),如果使用非阻塞的connect,连接失败使用select等待很短时间,如果还没有连接后,线程立刻结束释放资源,防止大量线程阻塞而使程序崩溃。”