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

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

connection refused

这个错误的原因是什么?

727062 次浏览

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

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

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

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

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

拒绝连接意味着您试图连接到的端口实际上没有打开。

因此,要么是连接到了错误的 IP 地址,要么是连接到了错误的端口,要么是服务器监听了错误的端口,要么就是服务器实际上并没有运行。

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

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

Telnet localhost 2080

如果它在听,它就能够做出反应。

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

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

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

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

从检查点防火墙的角度来看,如果您实际选择拒绝作为操作,那么您将看到来自防火墙的消息,从而向预期的攻击者暴露服务器前防火墙的存在。防火墙会悄悄地删除所有与策略不匹配的连接。拒绝连接几乎总是来自服务器

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

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

还有

arping <ipaddress>

这个 AskUbuntu 问题也有更多的信息。

我的工作电脑也有同样的问题。 问题是,当你进入 localhost 它去代理的地址,而不是本地地址,你应该绕过它遵循以下步骤

Chrome = > 设置 = > 更改代理设置 = > LAN 设置 = > 检查本地地址的旁路代理服务器。

如果您尝试打开到另一个主机的 TCP 连接,并看到错误“ Connection  拒絕”,那就意味着

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

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

https://www.rfc-editor.org/rfc/rfc793第69页:

同步接收状态

如果设置了 RST 位

如果这个连接是用一个被动的 OPEN 启动的(即 ) ,然后将此连接返回到 LISTEN 状态 并返回。无需通知用户。如果此连接是 然后以活动的 OPEN (即来自 SYN-SENT 状态)启动 连接被拒绝,发出用户“连接被拒绝”的信号 无论哪种情况,重传队列上的所有段都应该是 在活动的 OPEN 情况下,输入 CLOSED 状态并 删除 TCB,并返回。

我有一个完全不同的原因相同的信息: wsock32.dll没有被发现。::socket(PF_INET, SOCK_STREAM, 0);调用不断返回 INVALID_SOCKET,但原因是 winsock dll 没有加载。

最后,我启动了 Sysintrals 的进程监视器,注意到它搜索了 dll 的“所有地方”,但是没有找到。

无声的失败是伟大的!

1. 检查服务器状态。

2. 检查端口状态。

例如3306netstat -nupl|grep 3306

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

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

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

在我的情况下,当网站在我的国家被封锁,我不使用 VPN 时就会发生这种情况。 例如,当我试图从印度尼西亚访问 vimeo.com 时,它被屏蔽了。

  • 检查应用程序是否为 bind,以及发送请求的端口
  • 检查应用程序是否接受来自发送请求的主机的连接,也许您忘记允许所有传入的连接 0.0.0.0,默认情况下,它只允许来自 127.0.0.1的连接