【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する処理書いたら、発生しなくなりました。






コメント

このブログの人気の投稿

【iOS】Swiftでtransformから角度、ラジアン、ディグリー、スケールを求める

【android】PdfDocumentとPdfRenderer を利用しPDFの作成と表示 (java)

【iOS】UIViewControllerのライフサイクル (Swift)