【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する処理書いたら、発生しなくなりました。
コメント
コメントを投稿