2009-06-10 5 views
3

나는 모든 것이 잘 작동하는 WCF를 사용하여 통신하는 클라이언트/서버 스타일의 응용 프로그램을 가지고 있습니다. 응용 프로그램의 한 기능은 클라이언트 컴퓨터에서 서버로 파일을 가져 오는 것입니다 (중앙 제어).어떻게 TCPListener를 외부 IP 주소에 바인드 할 수 있습니까?

Central Control은 클라이언트의 지정된 폴더에있는 파일 목록을 요청하고 클라이언트가 각 파일에 연결하고 스트리밍 할 수 있도록 소켓을 사용하여 포트를 엽니 다. 각 파일마다 다른 포트 번호를 사용합니다.

이 방법은 로컬에서 테스트 할 때 잘 작동하지만 고객 환경에 배포 할 때 다음 예외가 발생하기 시작했습니다.

The requested address is not valid in its context 
    at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress) 
    at System.Net.Sockets.Socket.Bind(EndPoint localEP) 
    at System.Net.Sockets.TcpListener.Start(Int32 backlog) 
    at System.Net.Sockets.TcpListener.Start() 
    at AMIGA.Library.TransferFile.listenerThread() 

끝점의 IP 주소는 10. 입니다.. * 주소. 내가 봤어에 대한 답변 및 일반 합의 tcpListener 함께 외부 IP 주소로 바인딩 할 수 없습니다. 나는 생각하지 않았다 10. .. * 주소는 외부입니다. 나는이 작업에 대한 TcpListener를 사용할 수있는 방법은

tcpListener = New TcpListener(IEndPoint) 
Dim handlerSocket As Socket 
Dim thdHandler As Thread 
tcpListener.Start() 
RequestFile() 

없습니까 다음과 같이 예외를 throw

코드는 무엇입니까? 그렇지 않은 경우 어떤 대안이 있고 대안을 구현하는 것이 얼마나 쉬운가요?

우리는 방화벽 구성에 직접 액세스 할 수 없으므로 변경하는 데 몇 주가 걸릴 수 있음을 명심하십시오.

+0

"외부"의 정의는 상황에 따라 다양하지만 ... 맞습니다. 10.0.0.1/8은 개인 서브넷으로 지정됩니다. –

답변

2

응용 프로그램은 시스템의 내부 IP 주소에만 바인딩해야합니다. 문제는 방화벽이 포트 포워딩을 통해 내부 IP 주소로 외부 IP 주소를 자동으로 전달하지 않는다는 것입니다. 선택한 포트를 열 수있는 라우터에 대한 응용 프로그램 에서

  1. 사용의 UPnP (유니버설 플러그 N 플레이) 명령 : 쉽게 방화벽 구성을 수정할 수 없기 때문에, 3 개 대안이있다. 더 안전한 방화벽 구성 에 대해서는 UPnP를 사용할 수 없습니다.
  2. (더 복잡함) TCP Hole punching을 사용하여 방화벽을 통해 연결을 설정하십시오.
  3. 클라이언트가 서버에 연결될 수 있도록 감각을 변경하십시오. 서버는 UPnP 명령을 통해 동적으로 포트를 열거 나이 응용 프로그램에서 사용할 수 있도록 방화벽에 열린 포트 블록을 가지고 있습니다.

    어느 경우 든 WCF 연결이 보안으로 보호되어 다른 사람이 포트 검색을 통해 들어 와서 권한없이 파일에 액세스 할 수 없도록해야합니다.

+0

감사합니다. 마이크, 당신은 우리에게 좋은 조종사를주었습니다. 바인딩을 Localhost에서 중앙 컨트롤의 특정 네트워크 주소로 변경했습니다. 그것은 트릭을했다. – Hooloovoo

0

이 예외는 일반적으로 시스템에서 유효하지 않은 주소에 바인딩하려고 할 때 발생합니다. 바인딩하려는 IP가 시스템의 네트워크 인터페이스 중 하나에 할당되어 있습니까?

+0

연결은 WCF (서비스 모델)를 통해 이루어질 수 있으며 Ping 될 수 있지만 TcpListener.start 메서드가 호출 될 때 문제가 발생합니다. – Hooloovoo

+0

예, TcpListener의 생성자에 전달할 IPEndpoint가 컴퓨터에서 유효한 IPEndpoint인지 확인하려고합니다.네트워크 인터페이스 또는 IPAddress.Any 중 하나의 IP 여야합니다. – heavyd

관련 문제