解決socket.error: [Errno 98] Address already in use問題
阿新 • • 發佈:2019-01-28
一、基本設定
如果python中socket 繫結的地址正在使用,往往會出現錯誤,
在linux下:
則會顯示“ socket.error: [Errno 98] Address already in use”
在windows下:
則會顯示 “socket.error: [Errno 10048] 通常每個套接字地址(協議/網路地址/埠)只允許使用一次”
這是因為socket預設不支援地址複用,如果要複用需要顯示設定,即在繫結前呼叫setsockop函式t讓套接字允許地址重用:socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
例如:
self.recSocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.recSocket.settimeout(CHECK_TIMEOUT)
self.recSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.recSocket.bind(('', UDP_PORT))
二、進一步設定(併發連線量大需要設定)
上述是在程式中設定重用,此外如果併發連線請求過多的時候,即短時間內連線請求很多,系統自動釋放已佔用埠的時間還沒有到,又有連線請求(可用的埠已經被用完),所以還會出現 Address already in use錯誤提示),就會產生大量的TIME_WAIT狀態的連線。這種情況下就有必要調整下Linux的TCP/IP核心引數,讓系統更快的釋放TIME_WAIT連線。
用vi開啟配置檔案:
# vi /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1 # 這一行配置檔案裡如果有就不用添加了
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5
最後輸入下面的命令,讓核心引數生效:
# /sbin/sysctl -p