问题描述:
学习TCP套接字变成的过程中,在虚拟机的CentOs7系统上运行了基于TCP的服务器端,但是在本机Windows系统下运行客户端却始终不能成功通信,花了很长时间才解决问题,在此记录一下。
原因分析:
查了很多资料,发现这种情况下可以从三个方面检查:
- 检查代码
主要就是看客户端connect的IP是否正确、端口号是否被占用。 - 检查Linux的防火墙
解决方案:
客户端连接服务器连接失败,connect()函数返回的错误代码是10061
10061:目标主机主动拒绝,连接不能建立
所以就先从Linux的服务器端找问题了。问了ChatGPT,建议我把客户端代码里的服务器IP地址从原来的127.0.0.1
改成虚拟机的IP。这样改了以后确实有效,后续我成功解决问题以后把IP又换回127.0.0.1
确实也不能成功连接。为了方便和我一样的初学者解决问题,我把查看虚拟机IP地址的命令也放在这里:
ifconfig
输入ifconfig
以后显示的ens
的那个IPV4地址就是虚拟机的IP地址。
看了别的资料,在这一步你也需要额外检查一下,Windows那里的IP和这个虚拟机IP是否在一个子网,如果不是就需要在虚拟机设置里修改虚拟机IP,这里就不多介绍了。
然后就是检查当前Windows端是否能与Linux端进行通信,需要先运行Linux端的服务器程序。
在Windows的cmd窗口运行telnet 虚拟机IP 8080
telnet 虚拟机IP 8080
显示“无法打开到主机的连接。 在端口 8080: 连接失败”,说明Windows的客户端根本连接不了Linux的服务器端。
最后,在Linux端尝试关闭防火墙。
转自:CentOS7查看和关闭防火墙
查看防火墙状态
firewall-cmd --state
停止firewall
systemctl stop firewalld.service
禁止firewall开机启动
systemctl disable firewalld.service
直接关闭防火墙这种方式可以解决问题,但是不太安全。
也可以试着关闭该端口的防火墙
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
再尝试用telnet命令连接,发现连接成功,服务器和客户端可以正常通信了,问题解决。