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

时间:2010-02-25 10:55:23

标签: c sockets connection-refused

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

connection refused

出现此错误的原因是什么?

13 个答案:

答案 0 :(得分:73)

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

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

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

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

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

答案 1 :(得分:61)

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

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

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

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

答案 2 :(得分:16)

如果您尝试打开与其他主机的TCP连接并看到错误"连接被拒绝,"这意味着

  1. 您向其他主机发送了TCP SYN数据包。
  2. 然后您收到了一个TCP RST数据包作为回复。
  3. 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.
    

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:5)

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

telnet localhost 2080

如果正在倾听,则可以回复。

答案 5 :(得分:1)

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

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

arping <ipaddress>

This AskUbuntu问题还有更多信息。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

从Checkpoint防火墙的角度来看,如果您实际选择“拒绝为操作”,则会看到来自防火墙的消息,从而向预期的攻击者暴露服务器前面是否存在防火墙。防火墙将以静默方式删除与策略不匹配的所有连接。拒绝连接几乎总是来自服务器

答案 8 :(得分:0)

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

Chrome =&gt;设置=&gt;更改代理设置=&gt;局域网设置=&gt;检查绕过代理服务器以获取本地地址。

答案 9 :(得分:0)

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

答案 10 :(得分:0)

尝试传递端口参数“ -p”:

sudo iperf -c 127.0.0.1 -p 443

答案 11 :(得分:0)

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

答案 12 :(得分:-1)

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

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

无声的失败很棒!