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
주소 바인딩을 해제하기에 충분한지 의심됩니다 .