答案是:可以,但需要reuseaddr!
測試結果:
在linux虛擬機上,指定用同一個端口,通過TCP依次去connect兩個不同的服務S1和S2,
如果希望兩次connect操作都成功,那么兩次connect操作都必須設置reuseaddr選項為true,
否則,只有第一次連接會成功,第二次連接則報eaddrinuse的錯誤。
注: 至于S1和S2是否設置了reuseaddr選項,不影響測試結果。
測試過程(兩次都成功的情況):
在linux虛擬機上,打開erlang shell,然后執(zhí)行:
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