숨겨진 소켓이라는게 도대체 무엇인지 모르겠더라고요. 이런 오류 메세지는 처음 보는 오류인것 같습니다. 액세스 권한과 관계가 있다니? 어떤 오류인지 한번 알아보고 해결해 보도록 하겠습니다.
예외 발생 “액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했습니다.”
그동안 많은 에러들을 봐왔지만, 처음보는 에러 메세지입니다. 닷넷프레임워크 오류인데, 자세히 보기를 통해 본 스택트레이스 상으로는 서버소켓에서 발생하는 오류입니다. 서버소켓에 포트를 할당할 때 문제가 있는 상황입니다.
일반적으로 서버소켓이 지정된 포트를 오픈하지 못했을 때 오류가 발생하긴 하는데, 오류메세지에 액세스 권한에 의해 숨겨진 소켓에 액세스를 시도했다고 하니 잘 이해가 안갔습니다만, 그냥 서버 소켓이 열려는 포트를 이미 다른 프로그램에서 사용하고 있어서 포트충돌로 포트오픈이 안되는 상황이더라고요.
다른 어떤 프로그램이 해당 포트를 사용하고 있는지 모르기 때문에 숨겨진 포트라고 하는것 같습니다.
숨겨진 소켓 포트를 이미 사용중인 프로그램 찾는 방법
포트 충돌이 났기 때문에 어떤 프로그램이 내가 사용하려고 했던 포트를 선점해서 사용하고 있는지 찾아내서 그 프로그램을 종료를 시켜야 합니다. 여기서는 예를 들어 29500번 포트를 이용하려고 했었다고 예시를 들도록 하겠습니다.
윈도우즈 커맨드창을 실행시켜 netstat 명령어와 findstr 명령어를 조합하여 29500번 포트를 사용하고 있는 프로그램의 PID를 찾을 수 있습니다.
netstat -ano | findstr [포트번호 29500]
이렇게 명령어를 입력하면, 아래와 같이 29500번 포트를 사용하고 있는 프로그램의 PID를 알아낼 수 있습니다. PID는 Process ID 입니다.
C:\Users\admin>netstat -ano | findstr 29500
TCP 0.0.0.0:29500 0.0.0.0:0 LISTENING 8928
TCP 10.100.1.111:58942 10.100.1.100:29500 TIME_WAIT 0
TCP [::]:29500 [::]:0 LISTENING 8928
명령어 실행 후, 출력된 첫번째 라인의 8928 이라고 표시된 부분이 PID 입니다. 이 PID는 윈도우 작업관리자에서 확인이 가능하며, PID를 이용해 29500번 포트를 사용하는 프로그램을 찾을 수 있습니다.
윈도우 작업관리자 PID 확인 방법
윈도우 작업관리자는 기본적으로 PID는 표시해 주지 않습니다. 별도로 PID 컬럼도 표시하도록 설정을 해줘야 하는데 간단하게 설정할 수 있습니다.
작업관리자에 표시된 컬럼, 즉 이름, 상태 등등의 컬럼명에 마우스 우클릭을 하면 위의 화면과 같이 표시될 컬럼을 선택할 수 있는 체크메뉴가 나타납니다. 여기에서 PID 항목을 선택해서 체크해 주시면 PID 컬럼이 새로 추가가 됩니다.
(기본적으로 표시되지 않는 항목들이 몇개 있으니 궁금한 부분은 체크해서 확인해보세요.)
아까 윈도우 커맨드창에서 찾은 PID 8928 과 같은 PID를 찾으면 됩니다. 그 프로그램이 바로 29500번 포트를 사용하고 있는 프로그램입니다.
netstat 명령어 사용법
netstat 명령어는 프로토콜 통계 및 현재 TCP/IP 네트워크 연결 상태를 확인할 수 있는 명령어입니다. 서버소켓의 포트도 확인이 가능합니다.
NETSTAT [-a] [-b] [-e] [-f] [-i] [-n] [-o] [-p proto] [-r] [-s] [-t] [-x] [-y] [interval]
-a 모든 연결 및 수신 대기 포트를 표시합니다.
-b 각 연결 또는 수신 대기 포트 생성과 관련된 실행 파일을
표시합니다. 잘 알려진 실행 파일이 여러 독립 구성 요소를
호스팅할 경우 연결 또는 수신 대기 포트 생성과 관련된
구성 요소의 시퀀스가 표시됩니다.
이러한 경우에는 실행 파일 이름이 아래 [] 안에
표시되고 위에는 TCP/IP에 도달할 때까지
호출된 구성 요소가 표시됩니다. 이 옵션은 시간이
오래 걸릴 수 있으며 사용 권한이 없으면
실패합니다.
-e 이더넷 통계를 표시합니다. 이 옵션은 -s 옵션과 함께 사용할 수
있습니다.
-f 외부 주소의 FQDN(정규화된 도메인 이름)을
표시합니다.
-i TCP 연결이 현재 상태로 지속된 시간을 표시합니다.
-n 주소 및 포트 번호를 숫자 형식으로 표시합니다.
-o 각 연결의 소유자 프로세스 ID를 표시합니다.
-p proto proto로 지정한 프로토콜의 연결을 표시합니다. proto는
TCP, UDP, TCPv6 또는 UDPv6 중 하나입니다. -s 옵션과 함께
사용하여 프로토콜별 통계를 표시할 경우 proto는 IP, IPv6, ICMP,
ICMPv6, TCP, TCPv6, UDP 또는 UDPv6 중 하나입니다.
-q 모든 연결, 수신 대기 포트 및 바인딩된 비수신 대기 TCP
포트를 표시합니다. 바인딩된 비수신 대기 포트는 활성 연결과 연결되거나
연결되지 않을 수도 있습니다.
-r 라우팅 테이블을 표시합니다.
-s 프로토콜별 통계를 표시합니다. 기본적으로 IP, IPv6, ICMP,
ICMPv6, TCP, TCPv6, UDP 및 UDPv6에 대한 통계를 표시합니다.
-p 옵션을 사용하여 기본값의 일부 집합에 대한 통계만 지정할 수 있습니다.
-t 현재 연결 오프로드 상태를 표시합니다.
-x NetworkDirect 연결, 수신기 및 공유 끝점을
표시합니다.
-y 모든 연결에 대한 TCP 연결 템플릿을 표시합니다.
다른 옵션과 함께 사용할 수 없습니다.
interval 다음 화면으로 이동하기 전에 지정한 시간(초) 동안 선택한 통계를 다시 표시합니다.
통계 다시 표시를 중지하려면 CTRL+C를 누르세요.
이 값을 생략하면 현재 구성 정보가
한 번만 출력됩니다.