Tcp &引用;“正在使用的地址”;尝试从Erlang/Elixir进行UPD广播时出错
为了让节点在我的局域网上找到主节点,我让主节点广播一条消息(带有它的IP地址)。它与Python一起工作,没有问题,但是使用Elixir,我在尝试打开广播套接字时会得到一个“地址使用错误”。下面是一些有效的Python代码: udplisten.py: udpsend.py: 因此,udpsend.py只是在端口8477上广播一个时间字符串,udplisten.py打印它得到的任何内容。运行此代码时,无论两个程序中的哪一个先启动,都没有端口“地址使用中”冲突 现在,如果我运行udplisten.py,然后尝试在Elixir中打开UDP套接字:Tcp &引用;“正在使用的地址”;尝试从Erlang/Elixir进行UPD广播时出错,tcp,erlang,elixir,Tcp,Erlang,Elixir,为了让节点在我的局域网上找到主节点,我让主节点广播一条消息(带有它的IP地址)。它与Python一起工作,没有问题,但是使用Elixir,我在尝试打开广播套接字时会得到一个“地址使用错误”。下面是一些有效的Python代码: udplisten.py: udpsend.py: 因此,udpsend.py只是在端口8477上广播一个时间字符串,udplisten.py打印它得到的任何内容。运行此代码时,无论两个程序中的哪一个先启动,都没有端口“地址使用中”冲突 现在,如果我运行udplisten.
tbrowne@calculon:~/Dropbox/code/elixir/xxmaster/lib/priv$ iex
Erlang/OTP 20 [erts-9.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.5.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> {:ok, sock} = :gen_udp.open(8477, [broadcast: true, reuseaddr: true])
** (MatchError) no match of right hand side value: {:error, :eaddrinuse}
我使用:eaddrinuse获取:error元组
请注意,如果udplisten.py未运行,则我无法获得此信息:
iex(1)> {:ok, sock} = :gen_udp.open(8477, [broadcast: true, reuseaddr: true])
{:ok, #Port<0.1291>}
iex(2)>
iex(1)>{:ok,sock}=:gen_udp.open(8477,[broadcast:true,reuseaddr:true])
{:好的,#端口}
iex(2)>
但是,现在我的udplisten.py无法工作:
tbrowne@calculon:~/Dropbox/code/elixir/xxmaster/lib/priv$ python udplisten.py
Traceback (most recent call last):
File "udplisten.py", line 3, in <module>
s.bind(('', 8477))
OSError: [Errno 98] Address already in use
tbrowne@calculon:~/Dropbox/code/elixir/xxmaster/lib/priv$python udplisten.py
回溯(最近一次呼叫最后一次):
文件“udplisten.py”,第3行,在
s、 绑定(('',8477))
OSError:[Errno 98]地址已在使用中
很明显,我的Python套接字设置中的某些内容需要以Elixir中相同的方式进行设置,但我似乎无法在gen_udp文档中找到正确的选项。如何在Elixir中打开一个与Python中的udpsend.py例程相同的用于广播的套接字
我也很高兴接受Erlang的回答 如前所述,使用UDP,您不需要“打开”到地址/端口的连接,只需将数据发送到地址/端口即可。在Erlang中,这是使用:gen_udp.send/4
完成的,它接受套接字、地址、端口和数据
如果我在一个shell中启动python udplisten.py
,并从另一个shell运行以下命令:
iex(1)> {:ok, socket} = :gen_udp.open(0, [broadcast: true])
{:ok, #Port<0.1338>}
iex(2)> :gen_udp.send(socket, '255.255.255.255', 8477, "hello!")
:ok
如前所述,使用UDP,您不需要“打开”到地址/端口的连接,只需将数据发送到地址/端口即可。在Erlang中,这是使用:gen_udp.send/4
完成的,它接受套接字、地址、端口和数据
如果我在一个shell中启动python udplisten.py
,并从另一个shell运行以下命令:
iex(1)> {:ok, socket} = :gen_udp.open(0, [broadcast: true])
{:ok, #Port<0.1338>}
iex(2)> :gen_udp.send(socket, '255.255.255.255', 8477, "hello!")
:ok
要添加到下面Dogbert的答案中,您发送到
:gen_udp.open
的号码是本地端口地址。UDP消息有发送方和目的地,两者都由IP地址和端口指定。您试图将套接字绑定到本地端口号8477,这是Python脚本已经在使用的端口;通过发送“0”,您告诉网络堆栈“给我一个随机端口号”。要添加到下面Dogbert的答案中,您发送到:gen_udp。open
是本地端口地址。UDP消息有发送方和目的地,两者都由IP地址和端口指定。您试图将套接字绑定到本地端口号8477,这是Python脚本已经在使用的端口;通过发送“0”,您可以告诉网络堆栈“给我一个随机端口号”。
iex(1)> {:ok, socket} = :gen_udp.open(0, [broadcast: true])
{:ok, #Port<0.1338>}
iex(2)> :gen_udp.send(socket, '255.255.255.255', 8477, "hello!")
:ok
('hello!', ('127.0.0.1', 54182))