1. 程式人生 > >多個程序能否監聽同一個埠號?

多個程序能否監聽同一個埠號?

我們都知道socket是網路上兩個程序之間的雙向通訊鏈路, 即

socket = 《A程序的IP地址:埠號,B程序的IP地址:埠號》

那麼有個問題就很有意思了,不同的程序可以監聽在同一個IP地址:埠號麼?

根據Unix網路程式設計中的知識可知,服務端監聽一個埠會經歷:

1、根據套接字型別(Ipv4,Ipv6等)建立套接字socket

2、將套接字bind繫結到具體的網路地址和埠號

3、呼叫listen開始在這個套接字上進行監聽。

Unix提供了一個介面setsockopt()可以在bind之前設定套接字選項,其中就包括REUSEADDR這個選項,表明可以多個程序複用bind函式中指定的地址和埠號。

由此可知多個應用(程序),包括同一個應用多次,都是可以繫結到同一個埠進行監聽的。對應地C++、NET等高階語言也都提供了對應的介面。

從一些例子也可以看出,比如有時候你在伺服器上執行netstat -ano可能會發現同一個應用程式在同一個埠上有多個監聽,這是因為一些服務端應用程式可能會異常退出或者沒有完全釋放套接字,但是需要在重新啟動時還能夠再次監聽同一個埠,所以需要能夠具備重複監聽同一個埠的能力,因此也出現上述情形。