1. 程式人生 > >解決socket.error: [Errno 98] Address already in use問題

解決socket.error: [Errno 98] Address already in use問題

一、基本設定

如果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