怎么搭建釣魚網(wǎng)站軟件定制開發(fā)平臺
-
先啟動Server,再啟動Client,然后使用Ctrl+C關閉Server,馬上再運行Server,會得到以下結果:
bind error: Address already in use
-
這是因為,雖然Server的應用程序終止了,但TCP協(xié)議層的連接并沒有完全斷開,因此Server不能再監(jiān)聽同樣的端口
-
使用netstat命令可以查看,Server終止時,Socket描述符會自動關閉并發(fā)FIN段給Client,Client收到FIN后處于CLOSE_WAIT狀態(tài),但是Client并有終止,也沒有關閉Socket描述符,因此不會發(fā)FIN給Server,最終導致Server的TCP連接處于FIN_WAIT2狀態(tài)
-
我們再使用Ctrl+C將Client終止掉,Client終止時自動關閉Socket描述符,Server的TCP連接收到Client發(fā)的FIN段后處于TIME_WAIT狀態(tài);TCP協(xié)議規(guī)定,主動關閉連接的一方要處于TIME_WAIT狀態(tài),等待兩個MSL的時間后才能回到CLOSED狀態(tài),MSL在RFC1122中規(guī)定為兩分鐘,但各操作系統(tǒng)的實現(xiàn)不同,Linux上一般為半分鐘
-
由于我們先終止了Server,所以Server是主動關閉連接的一方,在TIME_WAIT期間仍然不能再次監(jiān)聽同樣的Server端口
-
在Server的TCP連接沒有完全斷開之前不允許重新監(jiān)聽是不合理的,因為前后Server占用的是同一個端口,但不一定是同一個IP地址
-
可以通過setsockopt()設置Socket描述符的選項SO_REUSEADDR為1,表示允許創(chuàng)建端口號相同但IP地址不同的多個Socket描述符