2011-12-02 2 views
0

낫 펀치 프로그램을하고 있었고 로컬 포트를 얻을 수있는 방법이 있는지 궁금합니다. 나는 내 컴퓨터의 포트가 아닌 공용 포트를 묶는 것처럼 보이는 "bind"기능을 사용해 보았습니다.udp 소켓 세션 중에 nat 뒤에있는 로컬 IP 및 포트를 얻는 방법은 무엇입니까?

Nat에서는 private ip : private port ---- mapped -> mapped -> public IP : 공개 포트, 개인 포트를 알고 싶습니다. 데이터 수신을 위해 자체 포트를 수신 할 수 있고 자신의 물건을 처리 할 수 ​​있습니다. 그 (것)들에 관하여 희망은 나 자신을 충분하게 맑게했다

+0

어떤 프레임 워크 또는 라이브러리를 사용하고 있습니까? – Phil

+0

@Phil, 우분투에서 개발 중 ..POSIX라고 생각합니다 – user992537

답변

1

bind()는 국부적으로 기계에서만 작동한다. NAT 뒤에있는 컴퓨터를 사용하는 경우 해당 컴퓨터에서 bind()을 호출하면 NAT의 공용 IP/포트가 아니라 해당 컴퓨터의 개인 IP/포트가 바인딩됩니다. 따라서 bind() 다음에 getsockname()을 입력하면 찾고있는 개인 포트가 제공되고 listen()은 연결된 개인 IP/포트에서 청취하기 시작합니다.

는 NAT의 공용 IP를 검색하려면/포트, 당신도 등 HASS는 NAT를 통과하는 외부 사이트와 같은 http://automation.whatismyip.com/n09230945.asp, http://iplookup.flashfxp.com,

+0

고마워요 ...이게 정말 도움이되었습니다 – user992537

0
을 NAT 자체가 UPNP 또는 SNMP를 사용하여 쿼리 또는 쿼리해야

당신이 달성하기를 원하는 것은 너무 분명하지 않지만, 당신에게 설명하려고 노력할 것입니다.

NAT를 트래버스하려면 "내부"에서 "외부"로 데이터 그램을 전송해야합니다. 그러면 NAT가 연관을 저장하고 외부 태그 세트가 응답 할 수 있습니다.

방금 ​​테스트 한 구현에서 NAT는 포트 번호를 1 : 1로 매핑합니다 (유용한 비 포트 포트 번호는 프로토콜과 관련있을 수 있음).

그럼에도 불구하고 첫 번째 데이터 그램을 보냈거나 널 주소와 널 포트에 바인딩하자마자 getsockadress()을 호출하면 실제 내부 주소와 포트를 얻을 수 있습니다.

패킷 원본에 대한 정보를 얻으려면 통신 파트너가 recvfrom()을 사용해야합니다. 여기서 NAT를 찾을 수있는 "외부"데이터가 있습니다.

+0

고맙습니다. – user992537