造成socket.error: [Errno 99] Cannot assign requested

在用python進行socket編程的時候,你可能會在進行connect的時候發現系統給你報了這麼個錯誤:

socket.error: [Errno 99] Cannot assign requested address

網上你去搜,基本都是說bind的時候,地址已經被用了,都是胡扯。地址被用報的錯誤應該是:

Address already in use纔對

然後我看得都是英文的,說明外國人也不是想象中的那麼一絲不苟,

言歸正傳。socket發起connect請求的時候會隨機分配一個端口給你。這個分配的端口是有範圍的,記錄在:

/proc/sys/net/ipv4/ip_local_port_range

這個文件裏面(fedora 17).當你用多個進程發起過多的請求的時候,端口用完了就會報這個錯誤。比如我就開了4個進程,一下發起了40000個請求。

你可以做個實驗試試,切換到root用戶,敲一下這條命令:

echo 32768 32769 > /proc/sys/net/ipv4/ip_local_port_range

這下你打開人人,微博就會發現很多圖片加載不出來了。因爲圖片加載在瀏覽器裏面就是並行加載的,由於你沒有足夠的端口數,所以圖片加載都失敗了。別當心,這個修改是臨時的(是不是臨時的我也不知道,聽別人說的)

修改過來用下面這條命令:

echo 32768 61000 > /proc/sys/net/ipv4/ip_local_port_range

32768 到 61000 是系統默認的隨機分配端口範圍(再次聲明,fedora 17版本)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章