摘要:作用將服務器關閉后,實際上關閉了服務器的監(jiān)聽套接字,如果此時用戶點擊開啟服務器,那么用戶希望的情況是服務器又立即啟動了。即使是第一次獲得的套接字不需要重用,也要啟用該選項,這樣后面每次啟用才會達到預期效果。
7.5.11 SO_REUSEADDR & SO_REUSEPORT SO_REUSEADDR
作用1
? 當沒有設置SO_REUSEADDR的時候,socketA先綁定到0.0.0.0:21,然后socketB綁定到192.168.0.1:21的時候?qū)?EADDRINUSE錯誤),因為0.0.0.0意味著"任意本地IP地址”,也就是"所有本地IP地址“,因此包括192.168.0.1在內(nèi)的所有IP地址都被認為是已經(jīng)使用了。但是在設置SO_REUSEADDR之后socketB的綁定將會成功,因為0.0.0.0和192.168.0.1事實上不是同一個IP地址,一個是代表所有地址的通配地址,另一個是一個具體的地址。注意上面的表述對于socketA和socketB的綁定順序是無關的,沒有設置SO_REUSEADDR,它們將失敗,設置了SO_REUSEADDR,它將成功。
作用2
? 將服務器關閉后,實際上關閉了服務器的監(jiān)聽套接字(close),如果此時用戶點擊開啟服務器,那么用戶希望的情況是服務器又立即啟動了。由于close后,執(zhí)行了主動關閉,執(zhí)行主動關閉的一端,在客戶執(zhí)行被動關閉之后會經(jīng)歷TIME_WAIT狀態(tài),如上圖。TIME_WAIT的時間為1-4分鐘不等,當某端口處于TIME_WAIT狀態(tài)時,是無法被綁定的(bind).如果在項目中用戶關閉服務器后,希望立即啟動,而程序卻要等1-4分鐘不等的時間后才能重新啟動服務器明顯不是我們所希望的。SO_REUSEADDR套接字選項就可以用來解決這個問題,實現(xiàn)瞬間重啟服務器.
注意
? SO_REUSEADDR需要在每次socket和bind前調(diào)用,“每次”也就是說,不能再想要重用的那一次,對通過socket新獲取的套接字啟用,例如socket->bind->close進入TIME_WAIT,而此時想要在TIME_WAIT狀態(tài)下綁定,那么接下來sock->setsockopt->bind,bind是不會成功的,或者只以為綁定的是同一個地址,就只第一次啟用一次,也是不行的。即使是第一次獲得的套接字不需要重用,也要啟用該選項,這樣后面每次啟用才會達到預期效果。
? SO_REUSEPORT的含義與絕大部分人對SO_REUSEADDR的理解一樣。基本上說來,SO_REUSEPORT允許你將多個socket綁定到相同的地址和端口, 只要它們在綁定之前都設置了SO_REUSEPORT。如果第一個綁定某個地址和端口的socket沒有設置SO_REUSEPORT,那么其他的socket無論有沒有設置SO_REUSEPORT都無法綁定到該地址和端口直到第一個socket釋放了綁定。
? SO_REUSEPORT并不表示SO_REUSEADDR。這意味著如果一個socket在綁定時沒有設置SO_REUSEPORT,那么同預期的一樣,其它的socket對相同地址和端口的綁定會失敗,但是如果綁定相同地址和端口的socket正處在TIME_WAIT狀態(tài),新的綁定也會失敗。當有個socket綁定后處在TIME_WAIT狀態(tài)(釋放時)時,為了使得其它socket綁定相同地址和端口能夠成功,需要設置SO_REUSEADDR或者在這兩個socket上都設置SO_REUSEPORT。當然,在socket上同時設置SO_REUSEPORT和SO_REUSEADDR也是可行的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/38554.html
摘要:在退出時執(zhí)行必要的挽救措施。在這種情況下,一旦被提供,等待一個進程終止指定的時間。如果進程在該時間限制內(nèi)沒有終止,則通過發(fā)出或中的對等方強制終止進程。所以有可能這是在中途執(zhí)行時發(fā)生的。 shutdownHook是一種特殊的結(jié)構(gòu),它允許開發(fā)人員插入JVM關閉時執(zhí)行的一段代碼。這種情況在我們需要做特殊清理操作的情況下很有用 用途 在Jboss,Jetty等容器中都可以看到shutdown...
摘要:變量常量綁定無特定關鍵字直接設值將一個文字列放到名為的變量里的類型由文字列上面定義的正則表達式變成了整數(shù)這里就帶來一個在大工程里很容易帶來困擾的問題理解代碼不得不受制于類型極易變的變量要理解代碼所必需的工作量極大可變變量前綴將變量與 變量(常量)綁定 python無特定關鍵字,直接設值a = r^s*(d{4}-d{2}-d{2})s{1,2}(.+)$ # 將一個文字列放到名為a的...
摘要:實體代碼如下所示恒宇少年碼云用戶名密碼創(chuàng)建內(nèi)添加一個注冊方法,該方法只是實現(xiàn)注冊事件發(fā)布功能,代碼如下所示恒宇少年碼云用戶注冊方法省略其他邏輯發(fā)布事件事件發(fā)布是由對象管控的,我們發(fā)布事件前需要注入對象調(diào)用方法完成事件發(fā)布。 ApplicationEvent以及Listener是Spring為我們提供的一個事件監(jiān)聽、訂閱的實現(xiàn),內(nèi)部實現(xiàn)原理是觀察者設計模式,設計初衷也是為了系統(tǒng)業(yè)務邏輯之...
閱讀 3207·2021-11-19 09:40
閱讀 3005·2021-09-09 09:32
閱讀 792·2021-09-02 09:55
閱讀 1393·2019-08-26 13:23
閱讀 2403·2019-08-26 11:46
閱讀 1229·2019-08-26 10:19
閱讀 2054·2019-08-23 16:53
閱讀 1072·2019-08-23 12:44