NetTcpBinding(WCF)을 사용하여 사용 가능한 TCP 포트를 찾는 방법(서버가 바인딩할 수 있음)

StackOverflow https://stackoverflow.com/questions/1803065

문제

.Net에서 다음 TCP 포트 찾기 원시 .net에서 이 작업을 수행하는 방법을 설명하지만 WCF를 사용하여 안전하게 수행하는 방법은 설명하지 않습니다.

내 단위 테스트에서는 NetTcpBinding을 사용해야 합니다. 사용 중인 포트를 하드 코딩하고 싶지 않습니다..

따라서 내 ServiceHost에서 사용될 때 NetTcpBinding이 자동으로 무료 포트를 선택하도록 하려면 어떻게 해야 합니까?

선택한 포트(또는 전체 엔드포인트 주소)를 나에게 알려주려면 어떻게 해야 합니까?

아니면 .NET을 사용하여 서버가 바인딩할 수 있는 몇 가지 포트를 어떻게 찾을 수 있습니까?


내 현상금이 새로운 답변으로 이어지지 않았다는 점을 고려하면 좋은 답변이 없다고 가정할 수 있다고 생각합니다.

도움이 되었습니까?

해결책 6

현재 나는 이것이 불가능하다고 생각한다.

다른 팁

자체 포트 찾기 논리를 굴릴 필요가 없습니다. 0으로 지정하면 Windows에서 사용 가능한 포트를 선택합니다.그런 다음 다음과 같이 디스패처를 조사하여 어떤 포트가 할당되었는지 확인할 수 있습니다.

// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);

 // Tell WCF to actually bind to a free port instead of 0
 endPoint.ListenUriMode = ListenUriMode.Unique;

 host.Open();

 // Now that the host has bound to a specific port, we can find out which one it chose
 return host.ChannelDispatchers.First().Listener.Uri;

포트를 0으로 설정합니다.이를 통해 OS는 사용 가능한 포트를 선택할 수 있습니다.어떤 포트가 사용되었는지 확인해야 하는 경우 로컬로 바인딩된 후 소켓에서 쿼리할 수 있습니다.

내가하는 일은 다음과 같습니다. 범위 1025-2000 (임의로 선택된 범위)의 임의 포트로 시작하십시오. 나는 그것을 묶으려고 노력하고 그것이 실패하면 나는 예외를 포착한다. 그런 다음 하나의 포트를 올라갑니다 (port = port % 2000 + 1025) 내가 랩 할 때까지. 나는 포트가 묶여 있지 않고 시험 실패를 포기합니다.

4 년 후 .. 현재 우리는 해결책이 있습니다. ListenUriMode 에게 Unique, 언급 된 바와 같이 MSDN

여기서 엔드 포인트 구성의 작은 예입니다

<endpoint address="service"
          binding="netTcpBinding"
          contract="Iservice"
          name="TcpBinding"
          bindingConfiguration="netTcpBindingNoSec"
          listenUriMode="Unique"
          />

그리고 이제 다음 문제 : 포트가 역동적이라면 고객이 어떻게 알 수 있습니까? 언급 된 바와 같이 이 답변 당신이 사용할 수있는 WCF 발견: 서버와 클라이언트 측면에서 약간의 구성이 필요하지만 잘 작동합니다 (기본적으로 20 초 동안 얻는 데 몇 초가 걸리지 만 5 개로 강요하는 데 아무런 문제가 없습니다).

임의의 높은 포트를 사용하는 경우 프로그램 후 시작하려는 다른 서버 프로세스와 충돌을 일으킬 수 있습니다. 포트 번호로 0을 사용하고 OS가 예약에 대해 관리하도록하십시오 (UNIX의/etc/서비스, Windows를 어떻게 처리하는지 모릅니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top