2010-02-25 80 views
61

我试图用C编写一个服务器程序, 使用另一个客户端,例如,当我尝试通过端口2080连接时出现此错误。连接拒绝错误的原因是什么?

connection refused 

可能是这个错误的原因是什么?

+0

我刚刚得到了这个错误,因为我托管我的网站的服务器出错。服务器仍然可以“ping”,http://www.downforeveryoneorjustme.com/表明它不仅仅是我,我还可以通过FTP访问它。几分钟后,错误得到解决。 – 2014-12-01 16:39:23

+1

@moose:ping不会告诉您是否可以访问特定端口广告监听,只有IP地址是否可达。但'connect()'取决于一个特定的IP和端口正准备使用。 – 2015-05-21 19:02:27

+0

服务器故障有一个关于[拒绝连接]的规范问题(http://serverfault.com/questions/725262/what-c​​auses-the-connection-refused-message)。 – Raedwald 2015-09-30 12:34:24

回答

54

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

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

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

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

检查防火墙和端口是开放后,使用telnet连接到IP /端口来测试连接。这可以消除应用程序中的任何潜在问题。

+5

防火墙通常会发出超时错误,因为连接(SYN)数据包刚被丢弃。拒绝连接是因为服务器已收到并拒绝了SYN数据包。 – CuriousPanda 2010-02-25 11:04:37

+12

并非总是如此,因为防火墙可以配置为拒绝而不是丢弃数据包。 – 2010-02-25 11:05:43

+0

连接()与不正确的服务器IP地址和端口号配置在客户端程序中也会导致errno 111. – smRaj 2015-01-14 21:59:16

7

连接被拒绝表示您尝试连接的端口实际上并未打开。

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

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

+2

这只是可能导致错误的几种可能条件之一。 – 2015-05-21 18:56:20

+1

该端口可以打开,但仍可能发生此错误。 – 2016-04-22 13:48:41

3

检查在这是在端口上的监听服务器端2080 首先试图确认它的服务器的机器发出的telnet到该端口:

远程登录本地主机2080

如果听,它是能够应对。

52

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

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

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

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

+3

这里还有一个边缘案例:http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-3.html#ss3.6。基本上,如果你正在对你的客户/服务器应用程序进行压力测试,并且你正在使用3.6中提到的天真方法,那么“连接​​被拒绝”错误可能会发生,这与上述两种情况是不同的。 – ernesto 2014-04-17 07:26:48

+0

这需要upvoted。一旦明显的原因(没有听到)得到解决,那么这实际上是最可能的解释,修复它可能是一个复杂的问题。 – 2017-11-29 12:11:10

+0

如果排队入站请求的积压达到最大值,我们该如何解决? – ACarter 2018-01-26 11:45:48

0

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

1

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

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

arping <ipaddress> 

This AskUbuntu问题有一些更多的信息也。

0

我的工作电脑出现同样的问题。 的问题是,当你输入localhost它关系到代理服务器的地址不是本地地址,你应该绕过它遵循这个步骤

铬=>设置=>更改代理服务器设置=>局域网设置=>选中对于本地地址不使用代理服务器。

12

如果你试图打开一个TCP连接到另一台主机,并看到错误“拒绝连接”,这意味着

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

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

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

SYN后状态

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

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

最后,我启动了Sysinternals的进程监视器,注意到它搜索的是“无处不在”的DLL,但没有找到它。

沉默的失败是伟大的!

+0

INVALID_SOCKET与'拒绝连接'无关。只有在您的代码缺少必需的错误处理时,才会发生“无声失败”。 – EJP 2017-08-16 10:41:12

+0

你的意思是我应该检查一下dll是否被加载了?你可能是对的。 – xtofl 2017-08-16 14:02:19

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 
0

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