我們都知道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可能會發現同一個應用程序在同一個端口上有多個監聽,這是因爲一些服務端應用程序可能會異常退出或者沒有完全釋放套接字,但是需要在重新啓動時還能夠再次監聽同一個端口,所以需要能夠具備重複監聽同一個端口的能力,因此也出現上述情形。