C - 为什么我不能从localhost外部访问我的服务器?

时间:2011-10-19 01:06:13

标签: c sockets localhost port

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

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

该功能的代码是here. (Pastebin) 我知道这很糟糕,我对网络编程还很不熟悉。没有任何好的深入教程可以向您展示您需要了解的所有内容。我想我必须买一本书......

3 个答案:

答案 0 :(得分:2)

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

大多数网络将阻止大多数端口,只打开端口80,443,25,8080和其他一些端口。

telnet server.ip.address 22580

并查看它是否连接。

答案 1 :(得分:2)

您的代码正在调用

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

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

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

我不确定getaddrinfo()可能会为您返回什么,但是从您的描述中可以看出它可能提供地址127.0.0.1(localhost)。如果bind()仅限于localhost接口,那么这是唯一响应连接请求的地址。如果绑定到INADDR_ANY,则所有接口都将响应连接请求。

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

答案 2 :(得分:0)

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