Nodejs의 dgram 모듈을 사용하여 간단한 UDP 서버를 실행하고 있습니다. 관련 코드는 간단하다 : 나는에서 nmap이 작업을 수행 할 때Node.js DGRAM 모듈 : 원격 컴퓨터로 UDP 메시지를 보낼 수 없지만 로컬 컴퓨터에 보낼 수 없습니다.
Proto Recv-Q Send-Q Local Address Foreign Address State
udp 0 0 localhost:10022 *:*
:
sudo netstat -l
나는이 항목을 참조하십시오
server = dgram.createSocket('udp4');
server.bind(10022,'127.0.0.1');
내가 로컬 컴퓨터에서 NETSTAT
는이를 사용하여 원격 컴퓨터는 인터페이스의 IP 주소를 사용합니다 :sudo nmap -sU -p 10022 192.168.7.171
나는이를 참조하십시오
Nmap scan report for 192.168.7.171
Host is up (0.00032s latency).
PORT STATE SERVICE
10022/udp closed unknown
내가 server.bind (10022, '127.0.0.1')를 사용할 때 잘 작동 동일한 시스템에서 실행되는 UDP 클라이언트 코드가 위에서 수행한다. 인터페이스에 할당 된 실제 IP 주소를 사용할 때는 그렇지 않습니다.
또한 원격 시스템의 클라이언트 코드를 사용하려고합니다. 그래서 server.bind (10022, '127.0.0.1') 대신 server.bind (10022, '192.168.7.171')를 사용하면 원격에서 UDP 프로세스로 메시지를 보낼 수있을 것으로 기대했을 것입니다. 기계. 나는 할 수 없다. 흥미롭게도 원격 장치에서 send 함수의 콜백은 오류를 반환하지 않습니다.
원격 컴퓨터에서 클라이언트 코드를 가져 오는 방법은 UDP 서버로 메시지를 보냅니다. 처음에는 방화벽 문제로 의심 되었기 때문에 모든 방화벽은 테스트를 위해 종료되었습니다. 어떤 경우에도 두 시스템은 테스트 중에 로컬 인트라넷에 있습니다.
'address'는 선택 사항입니다. 'bind'가 모든 로컬 주소를 듣고 자 할 때 이것을 지정하지 않으면이 방법으로 작동합니까? UDP는 기본적으로 신뢰할 수 없다는 오류 때문에 패킷이 보내지면 프로토콜에 의해 확인 응답이 다시 전송되지 않습니다. – aghidini
@aghidini 귀하의 제안이 효과가있었습니다! 감사. 나는 "주소와 포트가 socket.bind()에 전달되지 않을 때 메서드는 무작위 포트의"모든 인터페이스 "주소에 소켓을 바인딩합니다 (이는 udp4 소켓과 udp6 소켓 모두에 올바른 작업을 수행함). 주소 및 포트는 socket.address(). address 및 socket.address(). port를 사용하여 검색 할 수 있습니다. " 노드 문서에 있지만 포트를 지정하고 주소를 건너 뛸 수 있다는 것을 알지 못했습니다. ** 답변으로 의견을 게시 할 수 있다면 기꺼이 받아 들일 것입니다. ** 콜백의 오류에 대한 의견도 의미가 있습니다. – Sam
도와 주시겠습니까? 그러나 귀하의 예와 같이 다른 로컬 주소를 지정하여 작동하지 않는 이유가 확실하지 않은 경우에도 도움이됩니다. – aghidini