可以connect()返回0与非阻塞套接字?

时间:2012-12-25 03:02:46

标签: linux sockets

对于非阻塞网络套接字,connect()可以返回0吗?

man 页面只是说 如果“套接字无阻塞且无法立即完成连接”,它将返回-1并将errno设置为EINPROGRESS。

“立即”究竟意味着什么?

如果connect()在这种情况下CAN返回0,那么在什么情况下它将返回0代表成功?当客户端和服务器之间的网络非常好?或?

3 个答案:

答案 0 :(得分:2)

是的,非阻塞connect()可以返回0(这意味着成功),尽管TCP不太可能发生这种情况。 "紧接"意味着内核不必等待确定状态。你可以看到这种情况包括

  1. UDP套接字,其中connect()基本上是建议性的,允许稍后使用send(),而不是sendto()。

  2. 流式UNIX域套接字,其中对等体位于同一内核中,因此可以立即仔细检查。

  3. 与127.0.0.1(localhost)的TCP连接。

答案 1 :(得分:1)

“立即”,在此上下文中,意味着无需等待通过网络从另一台计算机接收数据。如果它可以立即完成,则可以返回零。例如,如果它连接到同一台机器上的另一个进程,则内核可以立即完成连接过程。

答案 2 :(得分:1)

connect(2)是系统调用,即进入内核的入口。这是一个多任务操作系统的机会,可以抢占您的进程以执行其他操作。

现在,假设您正在询问TCP,即使对于非阻塞套接字,它也不必,但connect(2)可以实现,以便在条目上启动协议握手,并在返回用户之前空间检查是否完整。然后,由于OS网络堆栈在用户应用程序方面主要是异步操作,如果您的进程在系统调用过程中被抢占并在以后切换回,则握手可能已经完成,并且成功,零,返回到应用程序。