Linux云服务器下 Socket 网络编程常见链接超时问题(非代码问题)
前提
在开发过程中除了代码问题以外还有很多非代码问题也是我们需要克服的。代码问题其实现在很好解决,借助教科书、网课、博客等公开资料或者是ai,即使是没有老师在身边,小白都可以很快找到某一段代码的问题。但是这些问题非代码问题环境问题这些往往要自己踩过坑才能知道。
比如我之前写过的博客关于老版本centos与新版vscode远程链接的问题。这次我要分享的是我在网络编程中遇到的问题。
(开始以为代码出现了问题,后来各路ai齐出,都没有发现问题,后来每一步都加上日志调试,最后才确定不是我代码问题)
一、连接超时核心问题(我遇到的)
第一关:端口不统一,请求无法正常路由(最简单的错误)
我在编写代码的时候为了方便,指定了只连接8080端口,但是后来想手动连接忘记了构造函数里面已经的设置了,再怎么输入都没用,导致客户端和服务端接口不一致。或者是客户端服务端在连接时输入错误也很容易发送这个问题。这个比较简单就不过多解释了。
但是到这里还是没有结束,问题还在。后来继续排查,发现原来还有第二关!!!!!
第二关:本地系统防火墙阻挡
核心问题:本地系统防火墙未放行目标端口。
未开放目标端口
后来我操作正确了,端口统一了,但是忽略了本地防火墙,代码本地测试正常,公网测试却超时,执行防火墙相关命令排查后,才发现防火墙未开放对应的UDP/TCP端口,数据根本无法通过。
解决:
# 启动本地防火墙
sudo systemctl start firewalld
# 添加目标端口放行(以UDP 8888为例)
sudo firewall-cmd --add-port=8888/udp --permanent
# 重载防火墙规则
sudo firewall-cmd --reload
# 查看当前放行端口列表
sudo firewall-cmd --list-ports
(但是我当时改完了发现还是不行)
后来发现第二关里还有第二关!!!!
第二关副本:开放端口但指定协议不对!!!!(我花时间最久的一个)
后来我开放了指定端口,但连接依旧超时,反复排查确认我确实放行了目标端口。
但是!!!!!
防火墙规则只开放了单独的TCB通信而UDP仍未开放!!!!
协议不匹配,相当于端口仍未放行,白白浪费了很多时间。
第三关:云服务器防火墙未配置
核心问题:若服务端部署在云服务器(如阿里云服务器、腾讯云服务器),仅配置本地系统防火墙远远不够,云平台自带的防火墙未放行端口,会直接拦截公网请求,导致连接超时!!
我曾以为本地防火墙放行后就算解决了,结果公网连接依旧超时,后来排查了半天发现还有第三关!!!!原来云服务器上的也要开放端口!!!
解决:(阿里云为例)进入控制台把防火墙配好
其他的常见的问题(我没遇到但是了解到)
端口占用/地址已在使用
核心问题:服务端绑定的端口已被其他进程占用,或程序异常退出后,套接字未及时释放,导致服务端无法正常绑定端口,间接引发客户端连接超时。
解决:查看 UDP 和 TCP 占用情况 (以8080为例)
#用netstat
netstat -tuln | grep 8080
# 或使用 ss
ss -tuln | grep 8080
输出示例
udp 0 0 0.0.0.0:8888 0.0.0.0:* 1234/program_name
tcp 0 0 0.0.0.0:8888 0.0.0.0:* 5678/another_program
其中 最后一列的数字是进程PID。如果发现有进程占用了某一个端口号,可以多查看几次,选没有被占用的端口,或者发送kill-9信号终止那个进程。
权限不足无法使用特定端口
核心问题 :服务端绑定的端口为1-1024之间的特权端口,普通用户无权限绑定,导致服务端无法正常启动,客户端连接超时。
刚开始时,我将服务端端口设为666(特权端口),未用root权限启动程序,服务端无法绑定端口,客户端连接时直接超时,却误以为是其他问题,排查很久才发现是权限不足。
解决:
1.选用1024以上的非特权端口(如:8888、8080等),避免权限问题;
2.若必须使用特权端口,用sudo命令以root权限启动程序。
结语
前面几个都是猪波一个个踩得坑,完美被我遇到上了
但最终也是过来了,希望大家合理利用现在的资源,遇到问题多方面排查,很多bug遇到过一次后,再遇到就能从容面对了。
更多推荐
所有评论(0)