Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tcp &引用;“正在使用的地址”;尝试从Erlang/Elixir进行UPD广播时出错_Tcp_Erlang_Elixir - Fatal编程技术网

Tcp &引用;“正在使用的地址”;尝试从Erlang/Elixir进行UPD广播时出错

Tcp &引用;“正在使用的地址”;尝试从Erlang/Elixir进行UPD广播时出错,tcp,erlang,elixir,Tcp,Erlang,Elixir,为了让节点在我的局域网上找到主节点,我让主节点广播一条消息(带有它的IP地址)。它与Python一起工作,没有问题,但是使用Elixir,我在尝试打开广播套接字时会得到一个“地址使用错误”。下面是一些有效的Python代码: udplisten.py: udpsend.py: 因此,udpsend.py只是在端口8477上广播一个时间字符串,udplisten.py打印它得到的任何内容。运行此代码时,无论两个程序中的哪一个先启动,都没有端口“地址使用中”冲突 现在,如果我运行udplisten.

为了让节点在我的局域网上找到主节点,我让主节点广播一条消息(带有它的IP地址)。它与Python一起工作,没有问题,但是使用Elixir,我在尝试打开广播套接字时会得到一个“地址使用错误”。下面是一些有效的Python代码:

udplisten.py: udpsend.py: 因此,udpsend.py只是在端口8477上广播一个时间字符串,udplisten.py打印它得到的任何内容。运行此代码时,无论两个程序中的哪一个先启动,都没有端口“地址使用中”冲突

现在,如果我运行udplisten.py,然后尝试在Elixir中打开UDP套接字:

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))