Linux下程序重啓後address already in use的問題解決

由於使用了守護腳本, 在程序遇到異常後雖然正常關閉了正在監聽的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有區別, 故需要用下面設置選項的方式.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章