ChatGPT解决这个技术问题 Extra ChatGPT

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

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

connection refused

此错误的原因可能是什么?

我刚刚收到此错误,因为我托管我的网站的服务器出现错误。服务器仍然可以ping编辑,downforeveryoneorjustme.com 表明它不仅是我,而且我仍然可以通过 FTP 访问它。几分钟后,错误被解决了。
@moose: ping 不会告诉您是否可以访问特定端口进行广告侦听,而只会告诉您 IP 地址是否可以访问。但 connect() 取决于准备好使用的特定 IP 和端口。
服务器故障有一个关于 Connection Refused 的规范问题。
以下是对 Connection Refused 的简要说明。
我在 Ubuntu 上收到连接被拒绝,因为我试图在“localhost”上接收连接,但“localhost”在我的机器上没有正确配置。将 'localhost' 更改为 '' (Python) 解决了这个问题。

R
Remy Lebeau

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

目标计算机上的端口未打开。该端口在目标计算机上是打开的,但其待处理连接的积压已满。客户端和服务器之间的防火墙阻止访问(同时检查本地防火墙)。

检查防火墙并确保端口打开后,使用 telnet 连接到 ip/port 以测试连接性。这会消除您的应用程序中的任何潜在问题。


防火墙通常会给出超时错误,因为连接(SYN)数据包只是被丢弃。连接被拒绝是因为服务器收到并拒绝了 SYN 数据包。
并非总是如此,因为可以将防火墙配置为拒绝而不是丢弃数据包。
客户端程序中服务器 IP 地址和端口号配置不正确的 connect() 也会导致 errno 111。
另外:当你需要访问https,但是你指定了http://...时也会出现这个错误。
@a'r 你怎么知道积压的状态?
J
Josh Darnell

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

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

还有一个尚未提及的原因 - 侦听端口实际上是打开的并且正在被积极使用,但是其排队的入站连接请求的积压已达到最大值,因此没有空间可供入站连接请求在该处排队片刻。服务器代码调用accept() 的次数还不够多,还没有完成为新队列项清除可用槽。

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


此处还解释了一种极端情况: softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/… 。基本上,如果您正在对客户端/服务器应用程序进行压力测试,并且您使用的是 3.6 中提到的幼稚方法,则可能会发生“连接被拒绝”错误,这与上述两种情况不同。
这需要赞成。一旦解决了明显的原因(什么都不听),那么这实际上是最有可能的解释,而修复它可能是一件复杂的事情。
如果排队入站请求的积压已达到最大值,我们该如何解决?
积压是按 IP 排队的吗?我尝试从 EC2 实例和我的本地机器上使用 telnet email-smtp.eu-west-1.amazonaws.com 25,EC2 实例 telnet 调用拒绝连接,而从我的本地机器上它可以工作
“没有人在听”可能是由于机器启动但服务器(软件)(例如 Apache)没有运行引起的。
C
Community

如果您尝试打开与另一台主机的 TCP 连接并看到错误“连接被拒绝”,则表示

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

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

请参阅第 69 页的 https://www.rfc-editor.org/rfc/rfc793

SYN-RECEIVED STATE 如果设置了 RST 位 如果此连接是通过被动 OPEN 启动的(即来自 LISTEN 状态),则将此连接返回到 LISTEN 状态并返回。无需通知用户。如果这个连接是通过一个活动的 OPEN 启动的(即,来自 SYN-SENT 状态),那么连接被拒绝,向用户发出“连接被拒绝”的信号。在任何一种情况下,重传队列上的所有段都应该被删除。并且在主动OPEN的情况下,进入CLOSED状态并删除TCB,然后返回。


很好的答案。这应该是接受的!
R
RedPandaCurios

连接被拒绝意味着您尝试连接的端口实际上并未打开。

因此,要么您连接到错误的 IP 地址,要么连接到错误的端口,要么服务器正在侦听错误的端口,或者实际上并没有运行。

一个常见的错误是在以网络字节顺序绑定或连接时未指定端口号...


这只是可能导致错误的几种可能情况之一。
端口可能已打开,但仍可能发生此错误。
服务器未实际运行是开发环境中非常常见的场景,团队更加关注生产服务器。
A
Adil

在服务器端检查它是否正在侦听端口 2080。首先尝试通过向该端口发出 telnet 在服务器计算机上确认它:

远程登录本地主机 2080

如果它在听,它能够响应。


J
Jack Sun

1.检查您的服务器状态。

2.检查端口状态。

例如 3306 netstat -nupl|grep 3306

3.检查您的防火墙。例如添加 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

netstat -a 帮助
C
Community

尽管您的情况似乎并非如此,但有时连接被拒绝错误也可能表明您的网络上存在 IP 地址冲突。您可以通过运行搜索可能的 ip 冲突:

 arp-scan -I eth0 -l | grep <ipaddress>

arping <ipaddress>

This AskUbuntu 问题也有更多信息。


İ
İbrahim Özbölük

我的工作电脑也遇到同样的问题。问题是,当您输入 localhost 时,它会转到代理的地址而不是本地地址,您应该按照以下步骤绕过它

Chrome => 设置 => 更改代理设置 => LAN 设置 => 检查绕过代理服务器以获取本地地址。


这解决了我。但在我的 Chrome 版本中,它被称为“打开您计算机的代理设置”,它打开了我的 MacOS 代理设置。从那里,我在“绕过主机和域的代理设置”下为本地地址添加了一个通配符,用于我正在使用的 TLD (*.test)
r
rajeeva9

在 Ubuntu 中,尝试 sudo ufw allow <port_number> 以允许防火墙访问您的服务器和数据库。


J
Julio Nalundasan

从检查点防火墙的角度来看,如果您实际上选择拒绝作为操作,您将看到来自防火墙的消息,从而向潜在的攻击者暴露服务器前面存在防火墙。防火墙将静默丢弃所有与策略不匹配的连接。拒绝连接几乎总是来自服务器


A
Aminah Nuraini

在我的情况下,当网站在我的国家被阻止并且我不使用 VPN 时,就会发生这种情况。例如,当我尝试从被阻止的印度尼西亚访问 vimeo.com 时。


x
xtofl

我收到了同样的消息,但原因完全不同:未找到 wsock32.dll::socket(PF_INET, SOCK_STREAM, 0); 调用不断返回 INVALID_SOCKET,但原因是未加载 winsock dll。

最后,我启动了 Sysinternals 的进程监视器,发现它“到处”搜索 dll,但没有找到。

无声的失败是伟大的!


INVALID_SOCKET 与“连接被拒绝”无关。只有当您的代码缺少所需的错误处理时,才会发生“静默失败”。
你的意思是我应该检查一下 dll 是否已加载?你可能是对的。