TCP/IP:连接服务器失败(错误原因:Connection refused)

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连接失败,被服务端拒绝连接。

Code:

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>int main()
{int client_fd = socket(AF_INET, SOCK_STREAM, 0);if (client_fd < 0){fprintf(stderr, "create socket error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(12500);if (inet_pton(AF_INET, "192.168.44.148", &server_addr.sin_addr) <= 0){fprintf(stderr, "inet_pton error!!!\n");exit(1);}if (connect(client_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){fprintf(stderr, "socket connect error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}fprintf(stdout, "connect to server ok!\n");close(client_fd); // free connectionreturn 0;
}

编译:

[jiang@localhost client]$ gcc -o client client.c
[jiang@localhost client]$ ll
total 16
-rwxrwxr-x. 1 jiang jiang 8237 Jun 10 09:41 client
-rw-rw-r--. 1 jiang jiang  906 Jun 10 09:29 client.c

运行:

服务器主机:[test1280@localhost ~]$ ifconfig | grep "inet addr"inet addr:192.168.44.148  Bcast:192.168.44.255  Mask:255.255.255.0inet addr:127.0.0.1  Mask:255.0.0.0
[test1280@localhost ~]$ netstat -an | grep 12500客户端主机:[jiang@localhost client]$ ./client
socket connect error=111(Connection refused)!!!

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)

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

2)

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

3)

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


服务器Code:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define BACKLOG 16int main()
{// socketint listen_fd = socket(AF_INET, SOCK_STREAM, 0);if (listen_fd < 0){fprintf(stderr, "create socket error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}int flag = 1;if (setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0){fprintf(stderr, "socket setsockopt error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}// bindstruct sockaddr_in server_addr;server_addr.sin_family = AF_INET; // IPv4server_addr.sin_port = htons(12500); // Portserver_addr.sin_addr.s_addr = htonl(INADDR_ANY); // IPif (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){fprintf(stderr, "socket bind error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}// listenif (listen(listen_fd, BACKLOG) < 0){fprintf(stderr, "socket listen error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}fprintf(stdout, "server init ok, start to accept new connect...\n");// acceptint client_fd = accept(listen_fd, NULL, NULL);if (client_fd < 0){fprintf(stderr, "socket accept error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}fprintf(stdout, "accept one new connect!!!\n");char msg[1024] = "";// read client-FIN=1 EOFwhile (read(client_fd, msg, sizeof(msg)-1) == 0)break;close(client_fd);return 0;
}

编译:

[test1280@localhost server]$ gcc -o server server.c
[test1280@localhost server]$ ll
total 16
-rwxrwxr-x. 1 test1280 test1280 9616 Jun 10 09:51 server
-rw-r--r--. 1 test1280 test1280 1555 Jun 10 09:50 server.c

运行:

[test1280@localhost server]$ ./server
server init ok, start to accept new connect...
accept one new connect!!!
[test1280@localhost ~]$ ifconfig | grep "inet addr"inet addr:192.168.44.148  Bcast:192.168.44.255  Mask:255.255.255.0inet addr:127.0.0.1  Mask:255.0.0.0
[test1280@localhost ~]$ netstat -an | grep 12500
tcp        0      0 0.0.0.0:12500               0.0.0.0:*                   LISTEN 
[jiang@localhost client]$ ./client
connect to server ok!

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

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

    // bindstruct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(12500); // Port// 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){fprintf(stderr, "inet_aton error!!!\n");exit(1);}if (bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){fprintf(stderr, "socket bind error=%d(%s)!!!\n", errno, strerror(errno));exit(1);}

编译 && 运行:

[test1280@localhost server]$ gcc -o server server.c
[test1280@localhost server]$ ll
total 16
-rwxrwxr-x. 1 test1280 test1280 9620 Jun 10 10:12 server
-rw-r--r--. 1 test1280 test1280 1737 Jun 10 10:12 server.c
[test1280@localhost server]$ ./server
server init ok, start to accept new connect...
[test1280@localhost ~]$ ifconfig | grep "inet addr"inet addr:192.168.44.148  Bcast:192.168.44.255  Mask:255.255.255.0inet addr:127.0.0.1  Mask:255.0.0.0
[test1280@localhost ~]$ netstat -an | grep 12500
tcp        0      0 127.0.0.1:12500             0.0.0.0:*                   LISTEN

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

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

[jiang@localhost client]$ ifconfig | grep "inet addr"inet addr:192.168.44.144  Bcast:192.168.44.255  Mask:255.255.255.0inet addr:127.0.0.1  Mask:255.0.0.0
[jiang@localhost client]$ ./client
socket connect error=111(Connection refused)!!!

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

如果我们在服务端主机(192.168.44.148)上向【127.0.0.1:12500】发起TCP连接请求,将会被允许:

修改客户端代码:

        struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(12500);if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0){fprintf(stderr, "inet_pton error!!!\n");exit(1);}

编译 && 运行:

[test1280@localhost client]$ ifconfig | grep "inet addr"inet addr:192.168.44.148  Bcast:192.168.44.255  Mask:255.255.255.0inet addr:127.0.0.1  Mask:255.0.0.0
[test1280@localhost client]$ gcc -o client client.c
[test1280@localhost client]$ ./client
connect to server ok!

总结:

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

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

TCP/IP:连接服务器失败(错误原因:Connection refused)相关推荐

  1. 进cf一直连接服务器失败怎么办,Win7玩穿越火线提示连接服务器失败的原因及解决方法...

    穿越火线简称CF,是很多用户都喜欢玩的一款射击游戏,但是在Win7系统中运行穿越火线的时候,出现了连接服务器失败的情况,检查网络是正常的,也可以浏览网页,怎么会出现这种情况呢?经过分析,原因有很多,解 ...

  2. 基于Mac——dbeaver连接MySQL数据库错误提示Connection refused

    新入坑Mac,因为工作原因会用到数据库,所以需要下载mysql(截止发表日期最新版本8.0.32).dbeaver.kettle,但在配置好之后无论怎么连接是一直提示Connection refuse ...

  3. 正版黎明杀机链接服务器失败,Win7电脑玩黎明杀机时连接服务器失败如何解决...

    想必有很多win7系统游戏玩家都玩过黎明杀机这款游戏,可是在玩的时候有不少用户发现这样一个问题,就是进行多人模式的时候,发现连接服务器失败,导致无法继续玩黎明杀机,要怎么办呢?下面以win7 64位旗 ...

  4. win10系统cf连接服务器失败,cf与服务器连接失败

    为了修复生存竞技模式偶现连接服务器失败的问题,我们将会对部分大区服务器进行临时维护,维护期间无法进行生存竞技模式,无法匹配枪王排位(已在游戏中的玩家不受影响),其他模式不受影响. 玩家在下载CF手游之 ...

  5. cf为什么一直连接服务器失败,为什么cf连接服务器失败的解决方法

    最近,超爱玩游戏的朋友表示,cf连接服务器老是失败.在网上各种百度"cf连接服务器失败的原因",还是没有找到解决方法.据他自己介绍,在连接服务器时,经常会出现连接失败的现象.这是为 ...

  6. icloud连接服务器时出现问题_icloud连接服务器失败怎么办-互盾苹果恢复精灵

    icloud是为苹果用户提供的云服务空间,可以帮助用户储存手机的一些重要数据,但是有很多用户在使用icloud的时候会出现问题,会出现icloud连接服务器失败怎么办,那么下面就为大家带来icloud ...

  7. win7 系统连接服务器失败,win7系统玩CF提示“连接服务器失败”如何解决

    CF穿越火线一款十分受欢迎的大型网络枪战游戏,许多win7系统用户电脑都安装CF穿越火线游戏,拥有一群忠实的游戏玩家.但最近在Win7纯净版系统下玩CF时经常会提示"CF连接服务器失败&qu ...

  8. win10显示连接不了服务器失败,win10系统玩CF提示“连接服务器失败”的操作方法...

    今天和大家分享一下win10系统玩CF提示"连接服务器失败"问题的解决方法,在使用win10系统的过程中经常不知道如何去解决win10系统玩CF提示"连接服务器失败&qu ...

  9. 通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败 错误 Connection refus

    错误描述 ERROR:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败.错误:"Connection refused: connect.请验证连接属性,并检查  ...

最新文章

  1. volatile对原子性、可见性、有序性的保证
  2. python第三方库有哪些常用的、请列举15个-你想要的Python面试都在这里了【315+道题】...
  3. cocos2d-x按钮CCControlButton的用法
  4. extern c用法解析
  5. c mysql 查不到数据_怎么检测不到MYSQL数据库的存在
  6. 【实践】预训练模型在华为信息流推荐中的应用与探索.pdf(附下载链接)
  7. faststart可以卸载吗_你的手机你做主!免 ROOT 卸载安卓手机预装APP
  8. 爱奇艺网络协程编写高并发应用实践
  9. Oracle时间日期操作
  10. mysql客户端备份数据库失败,mysqlhotcopy的使用和安装方法【快速备份mysql数据库】及错误解...
  11. python2.0 s12 day8 _ python线程python进程
  12. C#正则表达式快速入门
  13. HNUST-C语言课程设计 完成质量测试记录·
  14. Oracle Spatial详解
  15. 服务器系统飞行模式怎么关闭,win10系统开启飞行模式之后无法关闭怎么解决
  16. ORA-12154 另一种解决方式,IIS发布后出现的---解决思路---终极方案
  17. 【20210823】学习本不应该痛苦人生其实是一种享受
  18. php的amqp扩展 安装(windows) rabbitmq学习篇
  19. 一种高性能无锁队列设计
  20. 使用狸窝全能视频转换器实现给视频添加水印

热门文章

  1. Python 3.11 中的最佳新特性和修正
  2. mysql 进行加减乘除运算_MySQL字符串进行加减乘除的运算
  3. FPGA|Signal Tap抓取波形
  4. python—数据分析(二)
  5. ROS+python控制小乌龟走方形的实现rospy
  6. 1、EC气象数据批量下载
  7. 一加 3T ROM、内核、固件、Recovery、框架、软件(APP)总结
  8. Codeforces Round 865 (Div. 2)
  9. java反射 setAccess,Java反射 - setAccessible的影响(真)Java反射 - setAccessib
  10. idea中查找的快捷键