所謂綁定是指別人連接我只能通過我所綁定的端口,其實是說,你現在有這個端口開放了,人家可以連接到你的服務,也可以進行數據傳輸,但是也不一定要使用此端口進行傳輸,可能此端口只用於控制信息的傳輸
端口 = 端口 + Ip
TCP 三元組
UDP 2元組
默認情況下,一個線程的棧要預留1M的內存空間,而一個進程中可用的內存空間只有2G,所以理論上一個進程中最多可以開2048個線程,但是內存當然不可能完全拿來作線程的棧,所以實際數目要比這個值要小。
如果端口復用了(設置了socket的SO_REUSEADDR選項),在一個應用程序可以把n個套接字綁在一個端口上而不出錯。那現在是不是可以從這些套接字中並發地讀取了?答案是否定的——測試結果是只有最后一個套接字會正常接收數據。 端口復用最常用的用途應該是防止服務器重啟時之前綁定的端口還未釋放。這種情況下如果設定了端口復用,則新啟動的服務器進程可以直接綁定端口,直接接過前輩的槍。如果沒有設定端口復用,綁定會失敗,提示ADDR已經在使用中——那只好等等再重試了,麻煩! 最近上網亂看,發現還有其他用途,摘抄自非常經典的UNPv1: 1、當有一個有相同本地地址和端口的socket1處於TIME_WAIT狀態時,而你啟動的程序的socket2要占用該地址和端口,你的程序 就要用到該選項。 (這就是我說的情況啦) 2、SO_REUSEADDR允許同一port上啟動同一服務器的多個實例(多個進程)。但每個實例綁定的 IP地址是不能相同的。在有多塊網卡或用IP Alias技術的機器可以測試這種情況。 3、SO_REUSEADDR允許單個 進程綁定相同的端口到多個socket上,但每個socket綁定的ip地址不同。這和2很相似,區別請看UNPv1。 4、SO_REUSEADDR允許完全相同的地址和端口的重復綁定。但這只用於UDP的多播,不用於TCP。
bind的意義是將已經建立的“空白的”socket綁定在網絡上讓大家在需要時能夠找得到。如果不是把socket綁定在自己的機器上,而是另外一台機器,無法想象在實際中將如何運作。我們先假設系統允許這么做,那么當網絡上的其他用戶請求你的服務時,他們找到的是另外那台機器,但是那台機器還是要設法連到你的本機上才能讓你的socket接受請求並提供服務,但這豈不是多此一舉? 另外,使用bind並不需要去設定本機IP,只要將地址字段清零,系統就自動實現本機IP的綁定了。
is_open函數用法
如果讀寫出錯時,一般都是對方連接斷開了,這個時候調用is_open會發現還是true,正確的做法是,當遇到讀寫錯誤時,直接將socket關閉,這樣的is_open返回的就一定是false了。
win32下面is_open的實現:
- bool is_open(const implementation_type& impl) const
- {
- return impl.socket_ != invalid_socket;
- }
原來is_open其實是is_valid的意思,只是判斷這個句柄是不是合法,而不能通過它來判斷是不是已經連接到remote_endpoint。