此問題與a question about getting a free port in Haskell有關,其中我包含getFreePort
函數,該函數檢索第一個可用端口。此功能適用於Windows系統,但當我在我的Linux機器上嘗試時,它隨機失敗(空閒端口被報告爲繁忙)。爲什麼重新綁定到套接字將會隨機失敗?
我修改嘗試綁定重新到任意地址的功能,而且它隨機失敗:
getFreePort :: IO Integer
getFreePort = do
sock <- socket AF_INET Stream defaultProtocol
bind sock (SockAddrInet aNY_PORT iNADDR_ANY)
port <- socketPort sock
close sock
print "Trying to rebind to the sock"
sock <- socket AF_INET Stream defaultProtocol
bind sock (SockAddrInet port 0x0100007f)
port <- socketPort sock
close sock
return (toInteger port)
我明白,有對其他進程的競爭條件收購該端口,但這不可能嗎?
獲得一個空閒端口後,爲什麼要關閉用來獲取它的套接字?不要這樣做。只需使用相同的套接字,不要創建新的套接字並將其綁定到同一端口,這確實是競爭條件。關閉前一個套接字會將端口置於'TIME_WAIT'狀態,除非您使用'SO_REUSEADDR' /'SO_REUSEPORT'套接字選項 –
,否則它會在一段時間內無法重用。問題是我必須將端口號傳遞給兩個將在該端口上通信的外部進程。這就是爲什麼我必須關閉它。 –
這兩個進程爲什麼不是自己獲取端口並相互協調?你爲什麼在第三個過程中這樣做?您無法獲取端口然後關閉它,然後期望進程能夠使用它。你需要重新思考你的方法。 –