2016-08-23 2 views
1

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 서버로 메시지를 보냅니다. 처음에는 방화벽 문제로 의심 되었기 때문에 모든 방화벽은 테스트를 위해 종료되었습니다. 어떤 경우에도 두 시스템은 테스트 중에 로컬 인트라넷에 있습니다.

+0

'address'는 선택 사항입니다. 'bind'가 모든 로컬 주소를 듣고 자 할 때 이것을 지정하지 않으면이 방법으로 작동합니까? UDP는 기본적으로 신뢰할 수 없다는 오류 때문에 패킷이 보내지면 프로토콜에 의해 확인 응답이 다시 전송되지 않습니다. – aghidini

+0

@aghidini 귀하의 제안이 효과가있었습니다! 감사. 나는 "주소와 포트가 socket.bind()에 전달되지 않을 때 메서드는 무작위 포트의"모든 인터페이스 "주소에 소켓을 바인딩합니다 (이는 udp4 소켓과 udp6 소켓 모두에 올바른 작업을 수행함). 주소 및 포트는 socket.address(). address 및 socket.address(). port를 사용하여 검색 할 수 있습니다. " 노드 문서에 있지만 포트를 지정하고 주소를 건너 뛸 수 있다는 것을 알지 못했습니다. ** 답변으로 의견을 게시 할 수 있다면 기꺼이 받아 들일 것입니다. ** 콜백의 오류에 대한 의견도 의미가 있습니다. – Sam

+0

도와 주시겠습니까? 그러나 귀하의 예와 같이 다른 로컬 주소를 지정하여 작동하지 않는 이유가 확실하지 않은 경우에도 도움이됩니다. – aghidini

답변

1

bind()의 매개 변수는 선택 사항입니다. 생략하면 모든 로컬 주소 (0.0.0.0)를 수신하려고 시도 할 수 있지만 계속 포트를 지정하십시오. 예 :이 와이어에 보낼 때 UDP가 디폴트로 누락 된 오류 신뢰할 수없는 프로토콜에 대해서는

server.bind(10022); 

는 전송이 성공적으로 처리됩니다. UDP는 반송 및 확인 패킷을 보내지 않습니다. 신뢰할 수있는 채널이 필요하다면 TCP를 사용할 수 있습니다.

관련 문제