前言:
学习WebServer时需要打开服务器指定端口监听,设置10000为监听端口。本地浏览器访问IP:PORT失败。下面是我的解决问题的过程。
1.服务器安全组打开指定端口,然后设置目的端口是指定的端口(图中为10000)
2.确认服务器防火墙已经把端口放开(需用root权限)
ufw status
:查看防火墙状态(Inactive & active)
ufw allow 10000
:打开指定端口
ufw enable
:打开防火墙
ufw reload
:重启防火墙
或者懒一点直接关闭也行ufw disable
3.检查端口状态
netstat -an | grep 10000
查看端口应该是listen的状态,此时应该能通过指定端口telnet通。
因为我使用windows上telnet无法正常连接,所以我在虚拟机的linux系统上测试连通性。虚拟机使用直连模式。命令为nmap -p PORT -Pn IP_ADDRESS
以及telnet IP_ADDRESS PORT
粉色打码部分就是服务器的公网IP地址,测试显示都能连通。如果这里不通,考虑还是之前服务器里面端口、网络的设置问题。后面不多加赘述。
如果这个测试通过,那么端口及服务运行没有问题说明服务器这里是已经没有限制的。
所以考虑是自己的代码逻辑有问题
4.服务器端程序和客户端程序地址设置错误(重点)
(1)阿里云端服务器socket绑定阿里云的私网地址
(2)要连接阿里云服务器的客户端的socket要设置为阿里云的公网地址
(来自https://blog.csdn.net/weixin_43343803/article/details/102755084)
主要是第一点,服务器端要绑定私网的IP
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("172.23.9.154");//此处是私网IP不是公网,或者0.0.0.0也行
addr.sin_port = htons(port);
int ret = bind(lfd, (struct sockaddr*)&addr, sizeof(addr));
5.
以上全部设置一遍,也全都能检验成功,但是我的服务器还是没有收到来自浏览器的http请求。显示我的服务器已经在10000端口建立了连接。但是仍然没有收到回显。
后面经过一系列排查,发现函数阻塞在read里面。。。设置成非阻塞就成功了。