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

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

connection refused 

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

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

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

  2. 端口在目标机器上是打开的,但未完成的连接积压已满。

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

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

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

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

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

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

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

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

RST在TCP数据包上有点表示连接应该被重置。 通常这意味着另一台主机已经收到了连接尝试,并且正在主动拒绝你的TCP连接,但是有时候一个干扰的防火墙可能会阻塞你的TCP SYN数据包,并向你发送一个TCP RST。

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

SYN-RECEIVED状态

  If the RST bit is set If this connection was initiated with a passive OPEN (ie, 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 (ie, 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. 

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

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

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

在服务器端检查它是否在端口2080处侦听。首先尝试通过发送telnet到该端口在服务器机器上进行确认:

telnet localhost 2080

如果正在倾听,则能够回应。

虽然你的情况似乎不是这样,有时连接拒绝错误也可能表明你的networking上有一个IP地址冲突。 您可以通过运行search可能的IP冲突:

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

 arping <ipaddress> 

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

从Checkpoint防火墙的angular度来看,如果实际select“拒绝”作为“操作”,则会看到来自防火墙的消息,从而使攻击者看到服务器前面存在防火墙。 防火墙将默默删除与策略不匹配的所有连接。 拒绝连接几乎总是来自服务器

我的工作电脑出现同样的问题。 问题是,当你inputlocalhost它代理的地址不是本地地址,你应该绕过它按照这个步骤

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

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 

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

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

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

沉默的失败是伟大的!