這個問題發生在我們開發Python的Websocket Server時, 使用以下的程式碼架設服務
start_server = websockets.serve(server, 'localhost', args.port)
async with start_server:
await asyncio.Future()
啟動服務後立馬報錯以下的訊息:
OSError: [Errno 99] error while attempting to bind on address ('::1', 10240, 0, 0): cannot assign requested address
這可能的原因是我們的系統可能會對ipv6地址的綁定存在一些限制, 使用localhost時會優先嘗試ipv6位址(::1), 因此導致綁定錯誤, 而我們也可以查看一下/etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.224.2 fcbbffe22464
我們可以看到重點在這 👇
::1 localhost ip6-localhost ip6-loopback
照理來說 ::1 只會對應到ipv6…才對呀, 這主要是我們於Docker容器環境下運行時發生這種狀況, 因而導致綁定錯誤。
既然系統環境已然無法改變, 而我們也不想再去追究Docker環境面問題了, 此時我們還可以改個思路, 將localhost替換成ipv4的「127.0.0.1」或「0.0.0.0」即可。
start_server = websockets.serve(server, '127.0.0.1', args.port)
如此一來便能夠順利運行, 大功告成。
原來開發程式不僅只是專注於程式碼而已, 而是需要連同網路、硬體…等外部相關因素一同掌握, 才能夠在發生問題時快速的進行解決,因此我們不能止步於此, 必須不斷的學習。