
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フラグを設定することをお勧めします。それ以外の場合は、バインディングが成功するのを待ちます。これにより、管理をシステムに委ねる必要があるソケットファイルをハックすることなくアプリケーションを再起動できます。
答え2
lsof -iUDP
私はこれがあなたが探しているものだと思います:
$ sudo lsof -iUDP
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 726 avahi 12u IPv4 21843 0t0 UDP *:mdns
avahi-dae 726 avahi 13u IPv6 21844 0t0 UDP *:mdns
avahi-dae 726 avahi 14u IPv4 21845 0t0 UDP *:46374
avahi-dae 726 avahi 15u IPv6 21846 0t0 UDP *:34483
NetworkMa 732 root 23u IPv4 32835 0t0 UDP stewbian:bootpc->_gateway:bootps
postgres 848 postgres 8u IPv6 21908 0t0 UDP localhost:58947->localhost:58947
postgres 849 postgres 8u IPv6 21916 0t0 UDP localhost:35817->localhost:35817
postgres 850 postgres 8u IPv6 21912 0t0 UDP localhost:40321->localhost:40321
postgres 858 postgres 8u IPv6 21908 0t0 UDP localhost:58947->localhost:58947
postgres 859 postgres 8u IPv6 21908 0t0 UDP localhost:58947->localhost:58947
postgres 860 postgres 8u IPv6 21908 0t0 UDP localhost:58947->localhost:58947
postgres 861 postgres 8u IPv6 21908 0t0 UDP localhost:58947->localhost:58947
postgres 865 postgres 8u IPv6 21912 0t0 UDP localhost:40321->localhost:40321 0t0 UDP localhost:35817->localhost:35817
postgres 877 postgres 8u IPv6 21916 0t0 UDP localhost:35817->localhost:35817
cups-brow 5729 root 7u IPv4 153431 0t0 UDP *:631
PIDとプロセス名があることを確認できます。これがkill $PID
アドレスバインディングを解放するのに十分かどうか疑われます。