【问题标题】:Erlang connect by external ip addressErlang 通过外部 IP 地址连接
【发布时间】:2011-01-17 17:24:08
【问题描述】:

我用 erlang 编写简单的服务器应用程序。

此应用程序代码:https://gist.github.com/783117

我尝试使用 telnet 连接到它。当我连接到从路由获取的本地主机或本地 ip 地址时,它没问题,但是当我尝试使用外部 ip 连接到服务器时,它不起作用。

怎么了?

如果我使用带有 {0,0,0,0} 的选项:

Opts = [binary, {ip, 0,0,0,0}, {reuseaddr, true},
            {keepalive, false}, {active, false}],

我明白了:

异常退出:badarg

netstat -ltn | grep 110

tcp 0 0 0.0.0.0:110 0.0.0.0:* 听

route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0

0.0.0.0         192.168.1.1     0.0.0.0         UG    202    0        0 eth0

谢谢。

【问题讨论】:

  • 可能,您打开了绑定本地地址的端口,但您必须检查您的端口监听的 ip 以确保。你能运行netstat -ltn | grep 110route -n吗?
  • 防火墙是另一个可能有问题的经典。
  • 它应该是 {ip,{0,0,0,0}} 而不是 {ip,0,0,0,0} 在你的代码中。
  • 您应该检查传入的流量,例如线鲨。你试过吗?
  • 这似乎是网络问题,您的 netstat 打印输出显示 erlang 正确打开了端口。这个问题有两个部分:如何打开一个端口监听 erlang 中的所有接口? (已回答)以及为什么我不能从外部地址连接到系统中的端口(未回答并且可能是题外话)。我投票决定保留第一个,如果您愿意,可以为第二个打开另一个,并提供足够的数据来回答。

标签: erlang ip


【解决方案1】:

来自 gen_tcp manual:

listen(Port, Options) -> {ok, ListenSocket} | {错误,原因}

...

设置一个套接字来监听本地主机上的端口。

...

{ip, ip_address()}

如果主机有多个网络接口,此选项指定监听哪个。

我想你的服务器只监听本地主机。也就是说,您无法使用其他地址进行连接。您可能需要使用ip 选项。也许可以像在 C 中那样使用 INADDR_ANY,但我不知道。

[编辑]

即使没有ip 选项,它似乎也默认在 INADDR_ANY 上进行侦听(感谢 I GIVE CRAP ANSWERS)。 并且我可以从其他机器连接作者分享的原始代码。但是我的机器上禁用了防火墙

【讨论】:

  • 所有接口监听的方式是使用{0,0,0,0}作为ip
【解决方案2】:

您应该传递 {ip, {0,0,0,0}} 而不是 {ip, 0,0,0,0}。您传递了一个包含 5 个元素的元组,而不是 2 个元素的元组。

【讨论】:

    猜你喜欢
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2015-08-14
    • 1970-01-01
    • 2014-07-31
    • 2013-07-18
    • 1970-01-01
    相关资源
    最近更新 更多