连接拒绝错误的原因是什么?

2024-03-28 20:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用C语言写一个服务器程序, 例如,使用另一个客户机时,当我尝试通过端口2080连接时,会出现此错误。

connection refused

这个错误的原因是什么?


Tags: 端口客户机错误原因connection服务器程序refused
3条回答

此错误表示侦听套接字的操作系统识别入站连接请求,但选择故意拒绝该请求。

假设中间防火墙没有妨碍,那么操作系统拒绝入站连接请求只有两个原因(据我所知)。其中一个原因已经被多次提到-正在连接的侦听端口未打开。

还有一个原因尚未提及——侦听端口实际上已打开并正在使用,但其排队入站连接请求的积压已达到最大值,因此此时没有空间让入站连接请求排队。服务器代码调用accept()的次数还不够,无法为新队列项清除可用的插槽。

请稍等片刻,然后重试连接。不幸的是,无法区分“端口根本没有打开”和“端口已打开但现在太忙”。它们都使用相同的通用错误代码。

如果您试图打开到另一个主机的TCP连接,并看到错误“connection rejected”,这意味着

  1. 您向另一台主机发送了一个TCP SYN数据包。
  2. 然后您收到了一个TCP RST数据包作为回复。

RST是TCP数据包上的一个位,表示应该重置连接。通常,这意味着另一台主机已收到您的连接尝试,并且正在主动拒绝您的TCP连接,但有时,中间的防火墙可能会阻止您的TCP SYN数据包并将TCP RST发送回您。

https://tools.ietf.org/html/rfc793第69页:

SYN-RECEIVED STATE

   If the RST bit is set

     If this connection was initiated with a passive OPEN (i.e.,
     came from the LISTEN state), then return this connection to
     LISTEN state and return.  The user need not be informed.  If
     this connection was initiated with an active OPEN (i.e., came
     from SYN-SENT state) then the connection was refused, signal
     the user "connection refused".  In either case, all segments
     on the retransmission queue should be removed.  And in the
     active OPEN case, enter the CLOSED state and delete the TCB,
     and return.

原因可能有很多,但最常见的是:

  1. 目标计算机上的端口未打开。

  2. 目标计算机上的端口已打开,但其挂起连接的积压已满。

  3. 客户端和服务器之间的防火墙正在阻止访问(同时检查本地防火墙)。

检查防火墙和端口是否打开后,使用telnet连接到ip/端口以测试连接。这将从应用程序中移除任何潜在问题。

相关问题 更多 >