【Socket】Socket 通信で何度もBindしてたら、Bindができなくなった。
表題の通りで、 ソケット通信を利用したく、 何度も、bindをおこなっていたら、 突然「address already in use」が出るようになり、 アプリを再起動しないと再接続ができなくなった。 色々と調査していると、 CLOSE_WAITやらTIME_WAITなどがのキーワードが出てきて、 なんか、開放されるまでに時間がかかるとの事 えー。 とおもってもう少し調査していると。 SO_REUSEADDR を bind する前にセットすれば、可能になるとの事。 setsockopt(s,SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); これね。 まとめると、 bindする前に、おまじないを書く。これだけ。 いやー、ハマった、ハマった。 BOOL yes = 1; s = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(65000); addr.sin_addr.S_un.S_addr = INADDR_ANY; setsockopt(s,SOL_SOCKET, SO_REUSEADDR, (const char *)&yes, sizeof(yes)); bind(s, (struct sockaddr *)&addr, sizeof(addr)); --- 処理 -- close(s); 2021/01/15 追記 あと、素直に特定条件下で、Closeを呼びそこねているパターンがあり、 Bindしっぱなしだった、ちゃんとCloseする処理書いたら、発生しなくなりました。