145

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

connection refused

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

4

12 回答 12

126

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

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

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

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

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

于 2010-02-25T11:02:44.480 回答
84

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

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

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

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

于 2010-03-02T08:37:14.873 回答
36

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

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

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

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

同步接收状态

如果设置了 RST 位

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

于 2014-04-30T09:28:40.810 回答
23

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

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

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

于 2010-02-25T11:03:27.947 回答
7

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

远程登录本地主机 2080

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

于 2010-02-25T11:36:35.427 回答
3

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
于 2017-03-24T04:10:57.810 回答
1

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

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

arping <ipaddress>

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

于 2013-01-15T17:35:00.317 回答
1

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

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

于 2013-08-21T06:03:37.000 回答
0

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

于 2012-09-29T16:20:24.150 回答
0

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

于 2017-05-14T05:59:04.083 回答
0

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

于 2020-05-28T13:09:10.440 回答
-1

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

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

无声的失败是伟大的!

于 2016-10-03T13:55:06.990 回答