Mac OS XI で説明できない奇妙なソケット リークの問題が発生しました。他のポートの中でも 9010 (tcp)、9090 (tcp)、および 6454 (udp) をリッスンするオープン ソース デーモン (olad) があります。デーモンが終了すると、netstat はポート 6454 がまだ開いていてリッスンしていることを示します。
$ netstat -f inet -n | grep 6454
<nothing>
$ olad/olad
<exit server>
$ netstat -f inet -n | grep 6454
udp4 0 0 *.6454 *.*
ただし、lsof はソケットを表示しません。
$ lsof -i 4 -P | grep 6454
<nothing>
システムがこの状態になると、ポートにパケットを送信することで、キュー カウントが増加することがわかります。
$ netstat -f inet -n | grep 6454
udp4 612 0 *.6454 *.*
これは、[設定] -> [セキュリティとプライバシー] でアプリケーション ファイアウォールが有効になっていて、バイナリを初めて実行した場合にのみ発生します。つまり、ファイアウォールを無効にすると、リークは発生しません。または、ファイアウォールが有効になっている場合、ダイアログ ボックスが表示されて同意をクリックした最初の実行後、問題は発生しなくなります。
ソケットがリークすると、ファイアウォールを無効にしても解放されません。
プログラムが終了する前にすべてのソケットで close() を呼び出しており、fork() または新しいスレッドへの呼び出しがないことを確認しました。
バグ ケースを絞り込もうとしていますが、pipe()、socket()、bind()、listen()、ioctl()、fnctl()、および select() の間のかなり複雑な相互作用のようです。呼び出しの順序を変更し、ポート 9010 および 9090 でリッスンを削除すると、問題が解消されます。
これをデバッグし続ける方法についての提案や、Mac アプリケーション ファイアウォールが内部でどのように機能するかについてのガイドはありますか?