我家里有一台带有 NGINX 的 Debian 服务器机器。现在它只提供与 nginx 一起安装的默认 index.html。我在Dynu中获得了一个主机名,并通过Let's Encrypt获得了 TLS 证书
我可以使用我的主机名在 Web 浏览器上完美地访问我的默认 nginx 网站,并且一切正常。
但是我需要在这个 Debian 服务器中用 C 语言实现一个简单的服务器套接字,侦听端口 8080,并通过互联网从任何计算机使用 C 语言的客户端套接字连接到它。
我的问题是,尽管已经在我的家庭路由器中转发了端口 8080 并将端口 8888 添加到 Debian 服务器防火墙(sudo ufw allow 8888/tcp
和sudo ufw allow 8888/udp
),但我仍然无法连接到服务器套接字。
如果我在同一台机器上运行服务器和客户端套接字程序,它们在连接客户端时工作正常,localhost
所以我知道代码工作正常。问题是当我在 Debian 服务器中运行服务器套接字程序和在笔记本电脑中运行客户端套接字程序时,无论我使用 Debian 本地地址还是 dynu 主机名,它们都无法连接。
当我运行客户端时,它以错误结束,Connection refused
服务器套接字程序甚至不闪烁,它只是停留在等待端口 8888 上的连接。
我在开头提到了 nginx、主机名和证书,因为我不知道这是否会与独立于 nginx 的 c 服务器套接字冲突,我的意思是,我不知道这是否是 nginx 的限制。我不认为这是因为我使用的端口与配置 nginx 的端口不同,但我不确定。我什sudo systemctl stop nginx
至已经编辑了 nginx 服务器,但这并没有帮助。
我错过了什么?
更新:好的,我运行了我的服务器套接字并将它的监听,然后我运行netstat -ntlp
,现在我可以看到我的服务器套接字应用程序:
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 8959/socket-server/
我不得不更改为端口 8888,因为端口 8080 正在被“WWW Cache”(不管是什么)使用,但客户端仍然没有连接。
我的套接字服务器绑定到通过以下方式获得的地址getaddrinfo(NULL, port, &hints, &server_info)
您的 netstat 输出解释了正在发生的事情:
127.0.0.1 地址是“localhost”地址,这一行表明您的服务器仅在“localhost”上侦听!
您应该重新配置或修补您的服务器,以便它正在侦听可以在运行它的机器之外访问的地址。通常为 0.0.0.0(这意味着它可以通过附加到本地计算机的“任何”地址访问。)
如果您有它的 C 代码,请查看它是否将其套接字绑定到
INADDR_LOOPBACK
,这意味着 127.0.0.1 地址,即“localhost”。您可以尝试将其更改为INADDR_ANY
,这意味着 0.0.0.0 地址,可以通过网络访问(假设连接没有被防火墙或其他类型的过滤阻止。)更新:getaddrinfo(3)的手册页解释了传递的节点地址为 NULL 时的行为:
虽然解决问题的一种可能方法是将“0.0.0.0”地址传递给函数:
另一种可能的解决方案是更新
hints.ai_flags
以包含AI_PASSIVE
.如果它在本地机器上运行,
localhost
那么它可能是 Debian 服务器上的防火墙问题。您使用的那些ufw
命令看起来应该可以工作,但也许可以尝试sudo ufw allow 8080
使用/
. 您可以随时检查防火墙的开放端口,iptables -L
看看您的命令是否设置正确。如果您想使用不同的语法,这里有更多数据。
ufw
如果您想要更直接的方法,您可以使用 直接设置防火墙设置iptables
,使用如下命令:希望这可以帮助。