gpt4 book ai didi

Erlang 中的 TCP 端口

转载 作者:可可西里 更新时间:2023-11-01 02:33:26 24 4
gpt4 key购买 nike

我正在使用 Erlang 编写比特流客户端代码。我在同一个问题上被困了 4 天。

我将握手发送给所有对等点,每个对等点都有自己的 ip:port。

我使用 gen_tcp:connect 进行连接。

问题是我无法收到他们的回复。我做了很多研究并使用了一些程序来监控我的入站/出站连接。

对等点获取数据并将回复发送回我用来向他们发送握手的端口。

代码明智:get_tcp:connect 选择一个端口并使用该端口将数据发送到对等点。对等方在该端口上回复。然而,正如您在 Erlang 中所知,您需要使用 gen_tcp:listen 来获取回复连接并且您需要指定一个端口。在我的例子中,我应该监听的端口是 gen_tcp:connect 返回的端口。

我可以使用 inet:port 获取此端口号,但错误始终相同:端口正在使用中。我明白为什么会出现错误,这仅仅是因为我尝试监听的端口已被 gen_tcp:connect 使用。我试图关闭套接字以释放端口,但没有任何效果。

所以我的问题是:在 Erlang 中是否有可能以某种方式连接到对等点并将数据发送到端口,然后在同一端口上监听回复。如果不是,那么我必须以某种方式告诉对等方将数据发送回我选择的端口。

欢迎来自所有 Erlang 大师的任何想法。谢谢,

//弗兰克。

最佳答案

这里听起来有些不对劲,让我总结一下你正在尝试做的事情:

  • 您使用的是 TCP 连接而不是 UDP

  • TCP 连接如下所示:

    Erlang side: IP1:Port1   <---->  Peer side IP2:Port2
  • IP2:Port2 是您传递给 gen_tcp:connect 的端口,IP1 只是您本地计算机上接口(interface)的 IP,而 Port1 可能是由您计算机上的 TCP 堆栈选择的临时端口。

  • 如果对等方在同一个连接上回复,您将只获得数据

    {tcp, Socket, Data}

    作为端口所有者的消息(可能是调用连接的进程)。除非您使用被动模式:然后您必须调用 gen_tcp:recv og 获取数据。

  • 如果您正在调用 gen_tcp:listen,您会尝试打开另一个返回的连接。有些协议(protocol)可以做这种事情,例如FTP 但你必须使用另一个端口号(通常调用监听,然后获取端口号并通过现有连接将这些发送到可以连接到现有端口的客户端)。但是几乎所有较新的协议(protocol)都不再这样做了,因为它有点困惑并且需要有状态的防火墙。现在甚至 FTP 也在避免它。所以我强烈怀疑你不想这样做。

关于Erlang 中的 TCP 端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4155596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com