地址複用setsockopt()
阿新 • • 發佈:2018-12-04
地址複用setsockopt()
unix socket LinuxCp 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
}