由於使用了守護腳本, 在程序遇到異常後雖然正常關閉了正在監聽的socket, 但守護腳本再次啓動程序後提示 address already in use 端口綁定失敗, 使用了
int opt = 1;
setsockopt(mSocketFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
這段打開也是無用的, 根據網絡尋找答案, 修改/etc/sysctl.conf文件中的三個參數
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1
然後重啓運行還是未能解決問題, 最終獲取到的答案是還需要設置socket的SO_REUSEPORT選項纔行
int opt = 1;
setsockopt(mSocketFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
opt = 1;
setsockopt(mSocketFd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
在程序中bind之前設置這兩個選項即可解決問題, sysctl.conf文件也不需要進行修改了.
原因是第一種辦法是對UNIX系統有效的, 而LINUX實現的方式跟UNIX有區別, 故需要用下面設置選項的方式.