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