服务器拒绝原因:

connect 发起TCP连接请求被拒绝是由于目标服务器上无对应的监听套接字(IP && PORT)。(没有监听、无法创建、监听别的IP\端口……)

有几个可能性:


  1. 服务器没启动或未监听端口(用TCP工具连一下你的服务器,看下服务器是否正常监听端口。如果是Windows开发者也可以使用Windows的CMD命令行telnet测试下,格式是 telnet 地址 端口);
  2. 地址错误;
  3. 端口错误;
  4. 类型错误;
  5. 内存不足;
  6. 被防火墙拦截。

​摘自:【Python3 网络编程】ConnectionRefusedError: [Errno 111] Connection refused_廿四画生的博客-connectionrefusederror​

Linux中,通过系统调用(system call) connect 连接指定服务器建立TCP连接。

connect 最常见的失败原因是 Connection refused。

假设服务器IP是192.168.44.148,且并 未有 进程监听端口是12500时:

若有TCP连接请求包到达192.168.44.148,则192.168.44.148的内核将 回复RST包 给客户端。

此时,在客户端一侧看来就是connect连接失败,被服务端拒绝连接。


tcpdump抓取协议包:

[root@localhost ~]# tcpdump tcp port 12500 -i eth0 -s 0 -w jiang.cap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C2 packets captured
2 packets received by filter
0 packets dropped by kernel

wireshark分析jiang.cap:

1)

【网络】连接服务器失败(错误原因:Connection refused)| error 111: (111) Connection refused 原因分析_服务器


客户端调用 connect,发起TCP连接建立请求到服务端。

2)

【网络】连接服务器失败(错误原因:Connection refused)| error 111: (111) Connection refused 原因分析_客户端_02


服务器内核收到要连接本机12500端口的请求,发现并未有对应的监听SOCKET,于是回复RST到客户端。

3)

客户端调用 connect 失败,错误原因:Connection refused。

即使当前主机有进程监听12500端口,connect依然有可能被拒绝连接

略微修改下服务器代码(不使用地址通配INADDR_ANY):

// if (inet_aton("0.0.0.0", &(server_addr.sin_addr)) != 1)
// if (inet_aton("192.168.44.148", &(server_addr.sin_addr)) != 1)
if (inet_aton("127.0.0.1", &(server_addr.sin_addr)) != 1)

此时,在服务器上虽然有进程监听12500端口,但是监听​​套接字​​的IP地址是127.0.0.1(在127.0.0.1地址上监听12500端口)。

如果我们在客户端主机(192.168.44.144)上向【192.168.44.148:12500】发起TCP连接请求,将会被拒绝:

socket connect error=111(Connection refused)!!!

被拒绝原因是在148服务器上不存在监听套接字【192.168.44.148:12500】,只有监听套接字【127.0.0.1:12500】。

总结:

connect 发起TCP连接请求被拒绝是由于目标服务器上无对应的监听套接字(IP && PORT)。

在哪个IP上监听哪个端口,^_^。