socket 编程的端口和地址复用
生活随笔
收集整理的這篇文章主要介紹了
socket 编程的端口和地址复用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在linux socket網絡編程中,大規模并發TCP或UDP連接時,經常會用到端口復用:
int opt = 1;if(setsockopt(sockfd, SOL_SOCKET,SO_REUSEADDR, (const void *) &opt, sizeof(opt))){perror("setsockopt");return -1; }那么什么是端口復用呢,如何理解呢,可以解釋成如下:?
在A機上進行客戶端網絡編程,假如它所使用的本地端口號是1234,如果沒有開啟端口復用的話,它用本地端口1234去連接B機再用本地端口連接C機時就不可以,若開啟端口復用的話在用本地端口1234訪問B機的情況下還可以用本地端口1234訪問C機。若是服務器程序中監聽的端口,即使開啟了復用,也不可以用該端口望外發起連接了。
SO_REUSEADDR和SO_REUSEPORT
SO_REUSEADDR提供如下四個功能:
SO_REUSEADDR允許啟動一個監聽服務器并捆綁其眾所周知端口,即使以前建立的將此端口用做他們的本地端口的連接仍存在。這通常是重啟監聽服務器時出現,若不設置此選項,則bind時將出錯。SO_REUSEADDR允許在同一端口上啟動同一服務器的多個實例,只要每個實例捆綁一個不同的本地IP地址即可。對于TCP,我們根本不可能啟動捆綁相同IP地址和相同端口號的多個服務器。SO_REUSEADDR允許單個進程捆綁同一端口到多個套接口上,只要每個捆綁指定不同的本地IP地址即可。這一般不用于TCP服務器。SO_REUSEADDR允許完全重復的捆綁:當一個IP地址和端口綁定到某個套接口上時,還允許此IP地址和端口捆綁到另一個套接口上。一般來說,這個特性僅在支持多播的系統上才有,而且只對UDP套接口而言(TCP不支持多播)。SO_REUSEPORT選項有如下語義:
此選項允許完全重復捆綁,但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項才行。如果被捆綁的IP地址是一個多播地址,則SO_REUSEADDR和SO_REUSEPORT等效。使用這兩個套接口選項的建議:
在所有TCP服務器中,在調用bind之前設置SO_REUSEADDR套接口選項;當編寫一個同一時刻在同一主機上可運行多次的多播應用程序時,設置SO_REUSEADDR選項,并將本組的多播地址作為本地IP地址捆綁。
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nOptval , sizeof(int)) < 0)?
附
首先聲明一個問題: 當兩個socket的address和port相沖突,而你又想重用地址和端口,則舊的socket和新的socket都要已經被設置了SO_REUSEADDR特性,只有兩者之一有這個特性還是有問題的。
SO_REUSEADDR可以用在以下四種情況下。
(摘自《Unix網絡編程》卷一,即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。
源碼:
[cpp]?view plain?copy總結
以上是生活随笔為你收集整理的socket 编程的端口和地址复用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 修改tomcat端口号的方法:
- 下一篇: IAR中断定义#pragma vecto