对于非阻塞的网络套接字,connect()
是否可以返回0?
man手册只说:如果“该套接字是非阻塞的且连接不能立即完成”,则它将返回-1并将errno设置为EINPROGRESS。
“立即”到底是什么意思?
如果在这种情况下,connect()
可能返回0,那么它会在何种情况下返回0,表示成功?当客户端和服务器之间的网络非常好时吗?还是其他情况?
UDP套接字,其中connect()基本上是指导性的,允许稍后使用send(),而不是sendto()。
流UNIX域套接字,其中同行在同一个内核中,因此可以立即进行审查。
与127.0.0.1(localhost)建立的TCP连接。
connect(2)
是一个系统调用,也就是进入内核的入口。这是多任务操作系统抢占您的进程去做其他事情的机会。
现在,假设您正在询问TCP,即使对于非阻塞套接字,它也不必如此,但connect(2)
可以被实现为在进入时启动协议握手,并在返回到用户空间之前检查是否完成。然后,由于操作系统网络堆栈与用户应用程序大多是异步操作的,如果您的进程在系统调用中间被抢占并在以后的某个时间点切换回来,则握手可能已经完成,并且成功返回给应用程序的是零。