socket 编程的端口和地址复用
在linux socket網(wǎng)絡(luò)編程中,大規(guī)模并發(fā)TCP或UDP連接時(shí),經(jīng)常會(huì)用到端口復(fù)用:
int opt = 1;if(setsockopt(sockfd, SOL_SOCKET,SO_REUSEADDR, (const void *) &opt, sizeof(opt))){perror("setsockopt");return -1; }那么什么是端口復(fù)用呢,如何理解呢,可以解釋成如下:?
在A機(jī)上進(jìn)行客戶(hù)端網(wǎng)絡(luò)編程,假如它所使用的本地端口號(hào)是1234,如果沒(méi)有開(kāi)啟端口復(fù)用的話(huà),它用本地端口1234去連接B機(jī)再用本地端口連接C機(jī)時(shí)就不可以,若開(kāi)啟端口復(fù)用的話(huà)在用本地端口1234訪問(wèn)B機(jī)的情況下還可以用本地端口1234訪問(wèn)C機(jī)。若是服務(wù)器程序中監(jiān)聽(tīng)的端口,即使開(kāi)啟了復(fù)用,也不可以用該端口望外發(fā)起連接了。
SO_REUSEADDR和SO_REUSEPORT
SO_REUSEADDR提供如下四個(gè)功能:
SO_REUSEADDR允許啟動(dòng)一個(gè)監(jiān)聽(tīng)服務(wù)器并捆綁其眾所周知端口,即使以前建立的將此端口用做他們的本地端口的連接仍存在。這通常是重啟監(jiān)聽(tīng)服務(wù)器時(shí)出現(xiàn),若不設(shè)置此選項(xiàng),則bind時(shí)將出錯(cuò)。SO_REUSEADDR允許在同一端口上啟動(dòng)同一服務(wù)器的多個(gè)實(shí)例,只要每個(gè)實(shí)例捆綁一個(gè)不同的本地IP地址即可。對(duì)于TCP,我們根本不可能啟動(dòng)捆綁相同IP地址和相同端口號(hào)的多個(gè)服務(wù)器。SO_REUSEADDR允許單個(gè)進(jìn)程捆綁同一端口到多個(gè)套接口上,只要每個(gè)捆綁指定不同的本地IP地址即可。這一般不用于TCP服務(wù)器。SO_REUSEADDR允許完全重復(fù)的捆綁:當(dāng)一個(gè)IP地址和端口綁定到某個(gè)套接口上時(shí),還允許此IP地址和端口捆綁到另一個(gè)套接口上。一般來(lái)說(shuō),這個(gè)特性?xún)H在支持多播的系統(tǒng)上才有,而且只對(duì)UDP套接口而言(TCP不支持多播)。SO_REUSEPORT選項(xiàng)有如下語(yǔ)義:
此選項(xiàng)允許完全重復(fù)捆綁,但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項(xiàng)才行。如果被捆綁的IP地址是一個(gè)多播地址,則SO_REUSEADDR和SO_REUSEPORT等效。使用這兩個(gè)套接口選項(xiàng)的建議:
在所有TCP服務(wù)器中,在調(diào)用bind之前設(shè)置SO_REUSEADDR套接口選項(xiàng);當(dāng)編寫(xiě)一個(gè)同一時(shí)刻在同一主機(jī)上可運(yùn)行多次的多播應(yīng)用程序時(shí),設(shè)置SO_REUSEADDR選項(xiàng),并將本組的多播地址作為本地IP地址捆綁。
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const void *)&nOptval , sizeof(int)) < 0)?
附
首先聲明一個(gè)問(wèn)題: 當(dāng)兩個(gè)socket的address和port相沖突,而你又想重用地址和端口,則舊的socket和新的socket都要已經(jīng)被設(shè)置了SO_REUSEADDR特性,只有兩者之一有這個(gè)特性還是有問(wèn)題的。
SO_REUSEADDR可以用在以下四種情況下。
(摘自《Unix網(wǎng)絡(luò)編程》卷一,即UNPv1)
1、當(dāng)有一個(gè)有相同本地地址和端口的socket1處于TIME_WAIT狀態(tài)時(shí),而你啟動(dòng)的程序的socket2要占用該地址和端口,你的程序就要用到該選項(xiàng)。
2、SO_REUSEADDR允許同一port上啟動(dòng)同一服務(wù)器的多個(gè)實(shí)例(多個(gè)進(jìn)程)。但每個(gè)實(shí)例綁定的IP地址是不能相同的。在有多塊網(wǎng)卡或用IP Alias技術(shù)的機(jī)器可以測(cè)試這種情況。
3、SO_REUSEADDR允許單個(gè)進(jìn)程綁定相同的端口到多個(gè)socket上,但每個(gè)socket綁定的ip地址不同。這和2很相似,區(qū)別請(qǐng)看UNPv1。
4、SO_REUSEADDR允許完全相同的地址和端口的重復(fù)綁定。但這只用于UDP的多播,不用于TCP。
源碼:
[cpp]?view plain?copy總結(jié)
以上是生活随笔為你收集整理的socket 编程的端口和地址复用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 修改tomcat端口号的方法:
- 下一篇: IAR中断定义#pragma vecto