C - 为啥我不能从本地主机外部访问我的服务器?

Posted

技术标签:

【中文标题】C - 为啥我不能从本地主机外部访问我的服务器?【英文标题】:C - Why can't I access my server from outside localhost?C - 为什么我不能从本地主机外部访问我的服务器? 【发布时间】:2011-12-10 13:24:13 【问题描述】:

我最近一直在从事套接字编程;我目前正在制作一个服务器,它在端口上侦听传入连接,然后一旦它得到一个,就读入一个字符串并将其放入一个文件中。

当我从 localhost 远程登录到正在运行的服务器时,一切正常,但是当我尝试从其他任何地方访问它时,它就好像它不存在一样。 Nmap 没有显示特定的开放端口——来自本地主机或远程主机。它通过 localhost 上的 telnet 工作。

函数代码为here. (Pastebin) 我知道这是一团糟,我对网络编程仍然很陌生。确实没有任何好的深入教程可以向您展示您需要知道的所有内容。我想我得买一本书了……

【问题讨论】:

【参考方案1】:

我的猜测是您的端口被防火墙阻止了。尝试通过 22580 端口 telnet 到服务器,看看它是否应答。如果是这样,那么服务器和您的代码之间存在问题。我的猜测是它会超时而不应答,所以问题出在您的服务器和网络之间。

大多数网络会阻塞大部分端口,只开放端口 80、443、25、8080 和少数其他端口。

telnet server.ip.address 22580

看看它是否连接。

【讨论】:

可能是网络问题。我没有排除这种可能性。但是,我在服务器上运行了“iptables -A INPUT -p tcp --dport 22580 -j ACCEPT”和“iptables -A OUTPUT -p tcp --sport 22580 -j ACCEPT”。所以,我至少应该可以从本地网络访问它。 许多防火墙会阻止 LAN 上的节点之间的流量 - telnet 测试将是一个故事 ;-) @screennameless:您是否尝试访问同一局域网/子网上的服务器? 是的,仅在本地网络内。我还没有尝试向世界开放它。 @MattH 好吧,所以我对服务器进行了 telnet,它挂在那里什么也没做。我假设这意味着它没有拒绝它。但是如果我输入任何数据它什么都不会做,所以它没有连接到服务器。【参考方案2】:

可能需要更多信息,因为失败的可能原因有很多。如果从 Internet 访问(和 nmaping),您可能需要通过防火墙配置“打一个洞”以允许访问。否则,侦听器主机上的“netstat”和“tcpdump”等工具可能会提供更多有用的信息。

【讨论】:

好提示。 Netstat 显示“tcp 0 0 192.168.1.10:22580 192.168.1.101:1941 ESTABLISHED”如果你阅读了我对 Greg 下面帖子的评论,就会发现这种行为。【参考方案3】:

您的代码正在调用

    if(bind(*sock, b->ai_addr, b->ai_addrlen) == -1) 

其中b 是基于调用getaddrinfo 的结果。这可能不完全包含您想要的内容。看起来cliaddr 已经包含要传递给bind() 的正确数据,因此请改用它:

    if (bind(*sock, (struct sockaddr *)&cliaddr, sizeof(cliaddr)) 

我不确定getaddrinfo() 可能会为您返回什么,但从您的描述中听起来它可能提供了地址 127.0.0.1(即 localhost)。如果您 bind() 仅访问 localhost 接口,那么这是唯一响应连接请求的地址。如果绑定到INADDR_ANY,那么所有接口都会响应连接请求。

对于一个简单的套接字监听程序,您可能根本不需要调用getaddrinfo()

【讨论】:

看来我真的把这段代码搞砸了。我将其更改为您建议的内容,并且出现了几个错误,说 cliaddr 应该是“sockaddr”而不是“sockaddr_in”,但是如果我更改它,它会变得更加混乱。 哦,你需要一个演员表。套接字功能有点不稳定。我修改了答案。 有趣。大多数情况下,我没有看到任何行为变化,除了如果我在服务器运行时按 Ctrl^C 并通过 telnet 连接到它,则 telnet 会话会立即退出。 嗯,这意味着它已连接。您的代码的阅读部分现在正在等待您准确输入 130 个字符。如果您输入 130 个字符然后按 Enter 会发生什么? (可能需要 Enter,因为默认情况下 telnet 会对您的输入进行行缓冲,因此在您按 Enter 之前,您的服务器根本看不到任何内容。) 我认为你还不需要重写任何东西。您需要获得大量细节才能使其正常工作,而且您已经完成了大部分工作。如果您的 设计 有问题,请考虑重写,但如果您只是修复错误,请不要重写任何内容。

以上是关于C - 为啥我不能从本地主机外部访问我的服务器?的主要内容,如果未能解决你的问题,请参考以下文章

主机 - 使用外部设备访问本地网站

为啥我不能使用本地主机的邮件功能发送邮件? [复制]

为啥宿主机不能访问虚拟机

为啥外网无法访问我的服务器?

需要使用虚拟主机中的 apache 代理测试从我的本地主机到外部服务器的 html 页面的登录

为啥我的主机路径持久卷可以从所有 pod 访问?