setsockopt中參數之SO_REUSEADDR的意義

一、通常來講一個端口釋放後會等待兩分鐘以後才能再被使用SO_REUSEADDR是讓端口釋放後當即就能夠被再次使用。 html

    SO_REUSEADDR用於對TCP套接字處於TIME_WAIT狀態下的socket才能夠重複綁定使用。server程序老是應該在調用bind()以前設置SO_REUSEADDR套接字選項。TCP,先調用close()的一方會進入TIME_WAIT狀態 服務器

二、SO_REUSEADDRSO_REUSEPORT socket

SO_REUSEADDR提供以下四個功能: spa

    SO_REUSEADDR容許啓動一個監聽服務器並捆綁其衆所周知端口即便之前創建的將此端口用作他們的本地端口的鏈接仍存在。這一般是重啓監聽服務器時出現若不設置此選項則bind時將出錯。 .net

    SO_REUSEADDR容許在同一端口上啓動同一服務器的多個實例只要每一個實例捆綁一個不一樣的本地IP地址便可。對於TCP咱們根本不可能啓動捆綁相同IP地址和相同端口號的多個服務器。 server

    SO_REUSEADDR容許單個進程捆綁同一端口到多個套接口上只要每一個捆綁指定不一樣的本地IP地址便可。這通常不用於TCP服務器。 htm

    SO_REUSEADDR容許徹底重複的捆綁:當一個IP地址和端口綁定到某個套接口上時還容許此IP地址和端口捆綁到另外一個套接口上。通常來講這個特性僅在支持多播的系統上纔有並且只對UDP套接口而言(TCP不支持多播)。 blog

SO_REUSEPORT選項有以下語義: 接口

    此選項容許徹底重複捆綁但僅在想捆綁相同IP地址和端口的套接口都指定了此套接口選項才 進程

    若是被捆綁的IP地址是一個多播地址則SO_REUSEADDRSO_REUSEPORT等效。

使用這兩個套接口選項的建議:

    在全部TCP服務器中在調用bind以前設置SO_REUSEADDR套接口選項;

當編寫一個同一時刻在同一主機上可運行屢次的多播應用程序時設置SO_REUSEADDR選項並將本組的多播地址做爲本地IP地址捆綁。

    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,

   (const void *)&nOptval , sizeof(int)) < 0) ...

    Q:編寫 TCP/SOCK_STREAM 服務程序時,SO_REUSEADDR到底什麼意思?

    A:這個套接字選項通知內核,若是端口忙,但TCP狀態位於 TIME_WAIT ,能夠重用端口。若是端口忙,而TCP狀態位於其餘狀態,重用端口時依舊獲得一個錯誤信息,指明"地址已經使用中"。若是你的服務程序中止後想當即重啓,而新套接字依舊使用同一端口,此時SO_REUSEADDR 選項很是有用。必須意識到,此時任何非指望數據到達,均可能致使服務程序反應混亂,不過這只是一種可能,事實上很不可能。

    一個套接字由相關五元組構成,協議、本地地址、本地端口、遠程地址、遠程端口。SO_REUSEADDR 僅僅表示能夠重用本地本地地址、本地端口,整個相關五元組仍是惟一肯定的。因此,重啓後的服務程序有可能收到非指望數據。必須慎重使用 SO_REUSEADDR 選項。【2

1http://topic.csdn.net/u/20090103/16/a0414edb-b289-4c72-84da-39e155e8f4be.html

2

如下博客對這個問題進行了對答式的解答:

http://blog.sina.com.cn/s/blog_53a2ecbf010095db.html

3http://www.sudu.cn/info/html/edu/20050101/296180.html

相關文章
相關標籤/搜索