我正在使用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大师的任何想法.谢谢,
//坦率.
这里听起来有些不对劲,让我总结一下你要做的事情:
您正在使用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现在都在避免它.所以我强烈怀疑你不想这样做.