TCP的端口復用
端口復用最常用的用途應該是防止服務器重啟時之前綁定的端口還未釋放或者程序突然退出而系統沒有釋放端口。此時如果設定了端口復用,
則新啟動的服務器進程可以直接綁定端口。如果沒有設定端口復用,綁定會失敗,提示ADDR已經在使用中——那只好等等再重試了。
在TCP斷開鏈接時需要四次握手來斷開,當兩端都關閉了read/write通道以后還是要等待一個TIME_WAIT時間(作用是在網絡中殘余的TCP包消失)。
一般來說,一個端口釋放后會等待兩分鐘之后或三十秒才能再被使用,SO_REUSEADDR是讓端口釋放后立即就可以被再次使用。
SO_REUSEADDR套接字選項通知內核,如果TCP狀態位于 TIME_WAIT ,可以重用端口。如果TCP狀態位于其他狀態,重用端口時依舊得到一個錯誤信息,指明"地址已經使用中"。如果你的服務程序停止后想立即重啟,而新套接字依舊使用同一端口,此時SO_REUSEADDR 選項非常有用。必須意識到,此時任何非期望數據到達,都可能導致服務程序反應混亂,不過這種可能,事實上幾率很小。
套接字由相關五元組構成,協議、本地地址、本地端口、遠程地址、遠程端口。SO_REUSEADDR 僅僅表示可以重用本地本地地址、本地端口,整個相關五元組還是唯一確定的。
套接字由相關五元組構成,協議、本地地址、本地端口、遠程地址、遠程端口。SO_REUSEADDR 僅僅表示可以重用本地本地地址、本地端口,整個相關五元組還是唯一確定的。
應用方法:所有TCP服務器中,在調用bind之前設置SO_REUSEADDR套接口選項;
int bOptval=1;
int retSetsockopt=setsockopt(gServerListenSock,SOL_SOCKET ,SO_REUSEADDR ,(char *)&bOptval,sizeof(bOptval));
if (SOCKET_ERROR==retSetsockopt)
{
return 0;
}
端口復用允許在一個應用程序可以把 n 個套接字綁在一個端口上而不出錯。同時,這 n 個套接字發送信息都正常,沒有問題。
但是,這些套接字并不是所有都能讀取信息,只有最后一個套接字會正常接收數據,這個特性都為后門程序所應用.
SO_EXCLUSIVEADDRUSE和SO_REUSEPORT作用相反,不允許使用 端口復用,但這個參數只存在于windows中。
注意:如果是服務器,新老socket都要加SO_REUSEADDR參數;要想同地址同端口綁定,只能用在udp的多播。
端口復用允許在一個應用程序可以把 n 個套接字綁在一個端口上而不出錯。同時,這 n 個套接字發送信息都正常,沒有問題。
但是,這些套接字并不是所有都能讀取信息,只有最后一個套接字會正常接收數據,這個特性都為后門程序所應用.
SO_EXCLUSIVEADDRUSE和SO_REUSEPORT作用相反,不允許使用 端口復用,但這個參數只存在于windows中。
注意:如果是服務器,新老socket都要加SO_REUSEADDR參數;要想同地址同端口綁定,只能用在udp的多播。
posted on 2018-12-11 23:30 Benjamin 閱讀(6510) 評論(0) 編輯 收藏 引用 所屬分類: 雜談