【问题标题】:Connecting to server TCP in C在 C 中连接到服务器 TCP
【发布时间】:2020-09-17 03:45:25
【问题描述】:

我需要澄清一些事情。我正在用 C 语言制作服务器/客户端 TCP 程序。

如果客户端尝试连接(使用 connect())而服务器没有卡在 accept() 中,会发生什么?我是说,什么时候忙? connect() 返回什么?

编辑:

我在 Linux 环境中。

if (connect(...) < 0) {
    // ERROR AND LEAVE
}

这就是我在我的客户中所做的。根据我的阅读和学习,如果服务器很忙并且不接受,connect() 应该稍等片刻,然后返回 -1,如果服务器仍然很忙。那正确吗?

如果是这样,我该如何避免那个“小问题”?我希望它立即返回 -1。

【问题讨论】:

  • 查看connect(2) 的手册,它应该为您提供有关connect 返回的内容以及它在errno 中设置的错误值的所有信息。
  • 根据the connect documentation,返回值表示连接是否成功
  • 在 linux 上:连接正常阻塞,直到连接建立或经过一些未进一步指定的超时。在后一种情况下,它返回 -1 并相应地设置 errno。您可以通过使套接字变为非阻塞来更改此默认行为,但这是另一回事。
  • 非常感谢!你介意看看我的编辑吗? @mrksngl
  • “一点点”,正如我所说,没有进一步说明。我认为这取决于一些系统范围的参数。此外,如果返回 -1,并不意味着服务器很忙。它也可能不可用或发生了其他事情。您必须在手册页中查找可能的错误,就像其他人建议的那样。我也说过你可以改变行为,但即便如此:你并不真的喜欢“立即”返回:你必须给服务器(或者更好:整个网络系统)一些时间来实际建立连接。

标签: c sockets server client


【解决方案1】:

根据我的阅读和学习,如果服务器很忙并且不接受,connect() 应该稍等片刻,然后返回 -1,如果服务器仍然很忙。对吗?

TCP 连接的接受,即 TCP 握手,完全在操作系统内核中完成,独立于对 accept 的调用。 accept 只是将已经接受的连接返回到用户空间。因此,即使服务器当前很忙,只要挂起队列中仍有空间,连接就会成功。挂起队列的大小由listen 设置。如果挂起队列已满,因为应用程序在一段时间内没有从中检索接受的连接,但客户端仍然连接,则服务器操作系统将拒绝连接尝试,即connect 将失败。

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多