2013-04-24 3 views
0

로컬 네트워크에서 smb 공유를 검색하고 마운트하는 C 프로그램을 작성하고 있습니다. smb 서버의 호스트 이름을 얻으려면 udp nbns 패킷을 서버로 보냅니다. 패킷이 올 바르고 서버가 응답합니다. wireshark를 사용하여 확인하고 있습니다. 나는 보낸 패킷을 nbstat에서 보낸 패킷과 비교했으며 서버가 반환 한 패킷도 비교했습니다. 은 ID와 체크섬이 동일하고 동일합니다.udp 패킷에 대한 응답이 차단되었습니다.

nbstat를 사용하여 요청을하면 회신 패킷이 제대로 수신되지만 내 패킷에 대한 회신은 방화벽에 의해 차단되었을 수 있습니다. 서버에서 응답을 수신 한 후 클라이언트 시스템은 icmp "Destination unreachable (Port unreachable) (포트 도달 불가능)"메시지를 서버로 전송합니다. 방화벽에서 방화벽을 전송 한 것으로 의심됩니다.

호 시간 소스 목적지 프로토콜 길이 정보
12 29.870065 192.168.1.245 192.168.1.21 NBNS 92 이름 쿼리 NBSTAT * < 00> 00 <

와이어 샤크

로부터 출력 .......
13 29.870494 192.168.1.21 192.168.1.245 NBNS 253 이름 쿼리 응답 NBSTAT
(14) 29.870559 192.168.1.245 192.168.1.21 ICMP 281 연결할 수없는 대상 (포트에 연결할 수)

은 내가 연구를 할 수 있도록 어떻게해야합니까 끝내주는 eply?

답변

1

프로그램이 UDP 포트 137에서 수신 대기하여 서버 응답을 수신합니까? 그렇지 않은 경우 호스트가 ICMP 패킷을 연결할 수없는 이유를 설명합니다.

포트 137에서 수신 대기하는 경우 NBNS 쿼리를 포트 137로 보낼 때 원본 포트를 구성 해보십시오. 그러면 방화벽이이 포트로 패킷을 보내도록해야합니다.

+0

옳은 길에 나를 보내 주셔서 감사합니다. – bbuggy

+0

실수로 잘못된 sockaddr 구조에 바인딩을 지적했습니다. 나는 서버 ip의 137 번 포트에 연결했다. 올바른 sockaddr 인스턴스로 변경하면 ICMP 메시지가 사라집니다. 내 문제가 해결 된 것 같아. – bbuggy

+0

마지막으로 이해할 때 상황이 너무 쉬울 수 있습니다. 마지막 코멘트가 정확하지 않습니다. 내 프로그램이 포트 137에서 수신해야한다고 가정하고 이것을 달성하기 위해 서버 ip와 포트 137, 클라이언트 ip와 포트 137을 사용하여 struct sockaddr_in의 두 인스턴스를 만들었습니다. 첫 번째는 소켓에, 두 번째는 묶다. 이것은 실수였습니다. 이제는 소켓과 바인드 모두에 대해 첫 번째를 사용합니다. 그것은 그 문제를 해결했습니다. – bbuggy

관련 문제