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