比如下面的代碼
int reuse = 1;
int ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse));
if (ret == SOCKET_ERROR)
{log_error("_SetReuseAddr failed, err_code=%d, fd=%d", _GetErrorCode(), fd);
}
代碼解釋
setsockopt 函數用于設置套接字選項。參數解釋如下:
- fd:要設置選項的套接字描述符。
- SOL_SOCKET:選項的層次,這里表示套接字級別。
- SO_REUSEADDR:要設置的選項,這里表示允許重用本地地址。
(char*)&reuse:指向選項值的指針,這里傳遞 reuse 變量的地址。 - sizeof(reuse):選項值的大小。
setsockopt 成功時返回 0,失敗時返回 SOCKET_ERROR。
這段代碼的主要作用是設置 SO_REUSEADDR 選項,以允許在套接字處于 TIME_WAIT 狀態時,其他套接字可以綁定到相同的本地地址和端口。這在服務器應用程序中特別有用,可以減少由于端口占用導致的啟動失敗問題。如果設置失敗,代碼會記錄錯誤信息。
以下是一個完整的示例,展示如何在創建套接字后設置 SO_REUSEADDR 選項:
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>int main() {int fd = socket(AF_INET, SOCK_STREAM, 0);if (fd == -1) {perror("socket creation failed");return 1;}int reuse = 1;if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)) < 0) {perror("setsockopt(SO_REUSEADDR) failed");close(fd);return 1;}std::cout << "SO_REUSEADDR set successfully" << std::endl;// 繼續設置套接字的其他選項或進行綁定等操作...close(fd);return 0;
}
在這個示例中,套接字創建成功后,使用 setsockopt 設置 SO_REUSEADDR 選項,以便允許地址重用。如果 setsockopt 調用失敗,程序會輸出錯誤信息并終止。