Linux下プログラム再起動後のaddress already in useの問題解決
802 ワード
デーモンスクリプトを使用しているため、プログラムに異常が発生した後、正常に傍受中のsocketを閉じたが、デーモンスクリプトがプログラムを再起動した後、address already in useポートバインドに失敗したことを通知し、使用した
この段落を開くのも無駄で、ネットに基づいて答えを探して、/etc/sysctlを修正します.confファイルの3つのパラメータnet.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_timestamps = 1
その後、運転を再開するか、問題を解決できなかったか、最終的に得られた答えはsocketのSO_を設定する必要があることです.REUSEPORTオプションのみ
プログラムのbindの前にこの2つのオプションを設定すれば問題を解決できますsysctl.confファイルも修正する必要はありません.
第1の方法はUNIXシステムに対して有効であるが、LINUXの実現方法はUNIXと異なるため、以下のオプションを設定する方法が必要である.
int opt = 1;
setsockopt(mSocketFd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
この段落を開くのも無駄で、ネットに基づいて答えを探して、/etc/sysctlを修正します.confファイルの3つのパラメータ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の前にこの2つのオプションを設定すれば問題を解決できますsysctl.confファイルも修正する必要はありません.
第1の方法はUNIXシステムに対して有効であるが、LINUXの実現方法はUNIXと異なるため、以下のオプションを設定する方法が必要である.