对于一个非阻塞的networkingsokcet,可以connect()返回0吗?
手册页只是说它将返回-1,并且如果“套接字是非阻塞的,并且连接不能立即完成”,则将errno设置为EINPROGRESS。
“立即”究竟意味着什么?
如果connect()在这种情况下返回0,那么在什么情况下它将返回0表示成功? 当客户端和服务器之间的networking非常好? 要么 ?
谢谢,Jacky
是的,一个非阻塞连接()可以返回0(这意味着成功),虽然这不可能发生在TCP。 “立即”意味着内核不必等待确定状态。 你可以看到这种情况包括
UDP套接字,其中connect()基本上是建议性的,允许稍后使用send(),而不是sendto()。
流式传输UNIX域套接字,其中对等体位于相同的内核中,因此可以立即进行仔细检查。
与127.0.0.1(本地主机)的TCP连接。
在这种情况下,“立即”意味着不等待通过网络从另一台机器接收数据。 如果可以立即完成,则可以返回零。 例如,如果它连接到同一台机器上的另一个进程,则内核可以立即完成连接过程。
connect(2)
是一个系统调用,即进入内核。 这是一个多任务操作系统的机会,以抢占你的过程做其他事情。
现在,假设你问TCP,即使对于非阻塞套接字,它也不需要,但是可以实现connect(2)
,以便在入口上启动协议握手,并且在返回到用户空间之前检查它是否完成。 然后,由于OS网络堆栈对用户应用程序的操作大部分是异步的,所以如果您的进程在系统调用过程中被抢占并在稍后切换回来,握手可能已经完成,并且成功返回到零该应用程序。