1. 程式人生 > >地址複用setsockopt()

地址複用setsockopt()

地址複用setsockopt()

unix socket Linux

Cp from戴墨鏡.

1.setsockopt()作用

socket關閉之後,作業系統不會立即收回對埠的控制權,而是要經歷一個等待階段。此時對這個埠繫結就會出錯。想要立即進行繫結,就必須先設定SO_REUSEADDR.
或者在關閉socket的時候,使用setsockopt設定SO_REUSEADDR。才會消除等待時間。

       #include <sys/types.h>          /* See NOTES */
#include <sys/socket.h> int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen); int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

sockfd: 套接字描述字
level: 選項定義的層次;支援SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6.
optname: 需要設定的選項
optval: 指標,指向存放選項值的緩衝區
optlen: optval緩衝區長度

  • level SOL_SOCKET
選項名稱 說明 資料型別
SO_BROADCAST 允許傳送廣播資料 int
SO_DEBUG 允許除錯 int
SO_DONTROUTE 不查詢路由 int
SO_ERROR 獲得套接字錯誤 int
SO_KEEPALIVE 保持連線 int
SO_LINGER 延遲關閉連線 struct linger
SO_OOBINLINE 帶外資料放入正常資料流 int
SO_RCVBUF 接收緩衝區大小 int
SO_SNDBUF 傳送緩衝區大小 int
SO_RCVLOWAT 接收緩衝區下限 int
SO_SNDLOWAT 傳送緩衝區下限 int
SO_RCVTIMEO 接收超時 struct timeval
SO_SNDTIMEO 傳送超時 struct timeval
SO_REUSERADDR 允許重用本地地址和埠 int
SO_TYPE 獲得套接字型別 int
SO_BSDCOMPAT 與BSD系統相容 int

二、簡單用法

    //地址複用
    void set_reuseaddr(int sockfd, int optval)
    {
        int on = (optval != 0) ? 1 : 0;
        //int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
        /* sockfd:標識一個套介面的描述字。
          level:選項定義的層次;支援SOL_SOCKET、IPPROTO_TCP、IPPROTO_IP和IPPROTO_IPV6。
          optname:需設定的選項。
          optval:指標,指向存放選項值的緩衝區。
          optlen:optval緩衝區長度。
            返回值:  成功返回0,失敗返回 -1.  */

       if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)
            ERR_EXIT("setsockopt SO_REUSEADDR");
    }

    //埠複用
    void set_reuseport(int sockfd, int optval)
    {
    #ifdef SO_REUSEPORT
        int on = (optval != 0) ? 1 : 0;
        if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0)
            ERR_EXIT("setsockopt SO_REUSEPORT");
    #else
        fprintf(stderr, "SO_REUSEPORT is not supported.\n");
    #endif //SO_REUSEPORT
    }