소켓 파일은 어디서 찾을 수 있나요? (링크를 해제해서 삭제하고 싶어요..)

소켓 파일은 어디서 찾을 수 있나요? (링크를 해제해서 삭제하고 싶어요..)

UDP 소켓을 사용하는 프로그램을 디버깅하고 있습니다. 프로그램이 소켓을 생성하지만 다른 문제로 인해 프로그램이 중단되어 제대로 종료할 수 없습니다. 따라서 명령 셸을 닫으면 프로세스가 "죽은" 상태가 됩니다. 다음에 프로그램을 실행할 때 소켓 생성 중에 "생성: 주소가 이미 사용 중입니다"라고 표시되기 때문에 이 프로세스 동안 소켓이 해제되지 않은 것 같습니다. 물론 컴퓨터(실제로는 ubuntu 16.04가 설치된 작은 보드)를 재부팅하면 실험을 다시 시작할 수 있습니다.
나는 리눅스의 모든 것이 파일이라는 것을 알고 있으므로 어딘가에 소켓 파일이 있어야 합니다. 나는 여기를 읽었습니다 (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주소 바인딩을 해제하기에 충분한지 의심됩니다 .

관련 정보