socket网络编程中无法访问linux服务器指定端口(来自牛客网WebServer)

前言:

学习WebServer时需要打开服务器指定端口监听,设置10000为监听端口。本地浏览器访问IP:PORT失败。下面是我的解决问题的过程。

1.服务器安全组打开指定端口,然后设置目的端口是指定的端口(图中为10000)socket网络编程中无法访问linux服务器指定端口(来自牛客网WebServer)_第1张图片socket网络编程中无法访问linux服务器指定端口(来自牛客网WebServer)_第2张图片

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
socket网络编程中无法访问linux服务器指定端口(来自牛客网WebServer)_第3张图片
粉色打码部分就是服务器的公网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端口建立了连接。但是仍然没有收到回显。
在这里插入图片描述
socket网络编程中无法访问linux服务器指定端口(来自牛客网WebServer)_第4张图片
后面经过一系列排查,发现函数阻塞在read里面。。。设置成非阻塞就成功了。

你可能感兴趣的:(WS,服务器,linux,网络)