# 1. 創建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#解決socket4次握手後,端口占用問題
tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
設置當服務器先close 即服務端4次揮手之後資源能夠立即釋放,這樣保證了下次運行程序時,可以立即使用該端口
1、一般來說,一個端口釋放後會等待兩分鐘之後才能再被使用,SO_REUSEADDR是讓端口釋放後立即就可以被再次使用。
SO_REUSEADDR用於對TCP套接字處於TIME_WAIT狀態下的socket,纔可以重複綁定使用。server程序總是應該在調用bind()之前設置SO_REUSEADDR套接字選項。TCP,先調用close()的一方會進入TIME_WAIT狀態
2、SO_REUSEADDR和SO_REUSEPORT
SO_REUSEADDR提供如下四個功能:
SO_REUSEADDR允許啓動一個監聽服務器並捆綁其衆所周知端口,即使以前建立的將此端口用做他們的本地端口的連接仍存在。這通常是重啓監聽服務器時出現,若不設置此選項,則bind時將出錯。
SO_REUSEADDR允許在同一端口上啓動同一服務器的多個實例,只要每個實例捆綁一個不同的本地IP地址即可。對於TCP,我們根本不可能啓動捆綁相同IP地址和相同端口號的多個服務器。
SO_REUSEADDR允許單個進程捆綁同一端口到多個套接口上,只要每個捆綁指定不同的本地IP地址即可。這一般不用於TCP服務器。
SO_REUSEADDR允許完全重複的捆綁:當一個IP地址和端口綁定到某個套接口上時,還允許此IP地址和端口捆綁到另一個套接口上。一般來說,這個特性僅在支持多播的系統上纔有,而且只對UDP套接口而言(TCP不支持多播)。
SO_REUSEPORT選項有如下語義:
此選項允許完全重複捆綁,但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項才行。
如果被捆綁的IP地址是一個多播地址,則SO_REUSEADDR和SO_REUSEPORT等效。