Erlang中的TCP端口

时间:2010-11-11 14:46:57

标签: tcp erlang bittorrent

我正在使用Erlang来编写一个bittorrent客户端。我已经因为同样的问题而被困4天了。

我正在向所有对等方发送握手,每个对等方都有自己的ip:port。

我使用gen_tcp:connect来连接。

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

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

代码明智:get_tcp:connect选择一个端口并使用该端口将数据发送给对等端。同行回复该端口。但是,正如您在Erlang中所知,您需要使用gen_tcp:listen来获取回复连接,您需要指定一个端口。在我的情况下,我应该监听的端口是gen_tcp:connect返回的端口。

我可以使用inet:port获取此端口号,但错误始终相同:正在使用的端口。 我理解为什么我得到错误,这只是因为我正在尝试监听的端口已经被gen_tcp:connect使用了。我试图关闭Socket以释放端口,但没有。

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

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

//弗兰克。

2 个答案:

答案 0 :(得分:6)

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

  • 您正在使用TCP连接而非UDP

  • TCP连接如下所示:

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

  • 如果对等方回复同一连接,您只需获取数据

    {tcp, Socket, Data}
    

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

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

答案 1 :(得分:1)

Bittorrent有两种方式可以将对等体相互连接:

  • 您的客户端启动与对等方的连接,这是gen_tcp:connect。建立后的连接是双向的,这种唯一的连接就是您用于所有通信的连接。

  • 对等连接回客户端。这是gen_tcp:listen路径,后跟gen_tcp:accept。同样,建立了双向连接,然后使用它。

您可能会看到正在使用的端口,因为您正尝试在已有连接的“顶部”创建连接。在TCP连接上读一点可能是值得的。

可行的解决方案路径首先假设您只连接到其他人并忽略入站连接。针对接受入站连接的测试客户端运行,一切都会正常工作。然后,您可以在单向运行时向代码添加入站连接。请注意,握手类似,但存在一些细微差别。例如,连接器首先将info_hash发送给连接器(因此连接器可以在当前服务的种子中查找信息)。