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

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

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

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

【问题讨论】:

    标签: c sockets localhost port


    【解决方案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 之前,您的服务器根本看不到任何内容。)
    • 我认为你还不需要重写任何东西。您需要获得大量细节才能使其正常工作,而且您已经完成了大部分工作。如果您的 设计 有问题,请考虑重写,但如果您只是修复错误,请不要重写任何内容。
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 2016-06-09
    • 2016-08-04
    • 1970-01-01
    • 2022-07-28
    • 2017-07-31
    • 2012-04-21
    相关资源
    最近更新 更多