答案是:可以,但需要reuseaddr!
测试结果:
在linux虚拟机上,指定用同一个端口,通过TCP依次去connect两个不同的服务S1和S2,
如果希望两次connect操作都成功,那么两次connect操作都必须设置reuseaddr选项为true,
否则,只有第一次连接会成功,第二次连接则报eaddrinuse的错误。
注: 至于S1和S2是否设置了reuseaddr选项,不影响测试结果。
测试过程(两次都成功的情况):
在linux虚拟机上,打开erlang shell,然后执行:
25> gen_tcp:connect("100.84.35.75", 2815, [binary, {packet, 0}, {port, 7902}, {reuseaddr, true}], 60000).
{ok,#Port<0.580>}
26> gen_tcp:connect("100.84.35.75", 2816, [binary, {packet, 0}, {port, 7902}, {reuseaddr, true}], 60000).
{ok,#Port<0.581>}
然后在linux shell中,查看连接情况:
[nemo@localhost ~]$ netstat -antp | grep 7902
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 192.168.166.12:7902 100.84.35.75:2815 ESTABLISHED 5323/beam.smp
tcp 0 0 192.168.166.12:7902 100.84.35.75:2816 ESTABLISHED 5323/beam.smp