bind: Address already in use ソケットの再利用

socketを開いて、bindしてacceptして closeした直後に、同一 port を bindしたところ

bind: Address already in use

というエラーになった。


socketの close ミスかと思ってデバッグしても原因が分からず、いろいろ検索していたら分かった。
デフォルトの動作では、closeしてもしばらくの間ソケットが開放されないらしい。
これを回避するには setsockopt で SO_REUSEADDRを指定する必要がある。
バッドノウハウ。。。

    const int one = 1;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));