UDPソケットを使用するプログラムをデバッグしています。プログラムはソケットを生成しますが、他の問題によりプログラムが中断され、正しく終了できません。したがって、コマンドシェルを閉じると、プロセスは「死んだ」状態になります。次回プログラムを実行すると、ソケットの作成中に「生成:アドレスはすでに使用中です」と表示されるため、このプロセス中にソケットが解放されていないようです。もちろん、コンピュータ(実際にはubuntu 16.04がインストールされている小さなボード)を再起動すると、実験を再開できます。
私はLinuxのすべてがファイルであることを知っているので、どこかにソケットファイルがあるはずです。私はここを読んだ(https://stackoverflow.com/questions/34873151/how-can-i-delete-a-unix-domain-socket-file-when-i-exit-my-application)ソケットの接続を解除して(コマンドを使用してunlink
)削除できます。ソケットファイルはどこにあり、ソケットファイル(見つかった場合)に関する情報はどのように取得できますか?
ベストアンサー1
Googleは「REUSEADDR」(または「SO_REUSEADDR」など)と呼ばれるUDP(およびTCP)ソケットパラメータとREUSEPORT(違いの確認)を提供します。
アプリケーションでUDPソケットを作成するときに「REUSEADDR」を使用すると、ポートにバインドするときにSO_REUSEADDRフラグが設定されます。これは、複数のスレッドまたはプロセスがエラーなしで同じアドレス:ポートにバインドできることを意味します(すべてフラグが設定されている場合)。最後にバインドされたプロセスだけがトラフィックを受信するので、以前のリスナー(あなたの場合は機能しないアプリケーション)から制御を取得します。
サーバーアプリケーションを設計するときにサービスをすばやく再起動できるように、REUSEADDRフラグを設定することをお勧めします。それ以外の場合は、バインディングが成功するのを待ちます。これにより、管理をシステムに委ねる必要があるソケットファイルをハックすることなくアプリケーションを再起動できます。