2014-10-31 2 views
0

C#, .Net 4에서는 포트에서 UDP 메시지를 보내고 동일한 포트에서 응답을 수신해야합니다.UDP 클라이언트가 빈 포트를 너무 늦게 할당했습니다.

고정 포트를 사용했지만 고객이 문제가 발생하여 사용 가능한 포트를 사용하고 싶습니다. 포트 번호에 대해 0을 사용하여이를 수행 할 수있는 것처럼 보이지만 작동하지 않습니다. 좀 더 자세히 살펴보면, 포트가 실제로 사용될 때까지 포트를 할당하지 않는 것처럼 보입니다. 따라서 두 개의 바인드 구문이 다른 포트로 연결될 수 있습니다.

MSDN에서

:

"당신이 사용하는 로컬 포트를 상관하지 않는 경우, 포트 번호 0을 사용하여 IPEndPoint로를 만들 수 있습니다이 경우, 서비스 공급자가 사용 가능한 할당합니다. 포트 번호가 1024와 5000 사이 인 경우 위의 방법을 사용하는 경우 LocalEndPoint를 호출하여 주소와 포트 번호가 할당 된 로컬 네트워크를 찾을 수 있습니다. 연결없는 프로토콜을 사용하는 경우 은 완료 할 때까지이 정보에 액세스하십시오 send o 받는다. "

문제는 초기화시 보내기를 설정하고 수신하려고합니다. 수신을 설정하기 위해 첫 번째 전송을 기다릴 때 일부 응답을 놓칠 수 있습니다. 초기화를 마칠 수 있도록 가비지 메시지를 포트에 할당하는 것보다 더 나은 대답이 있습니까?

내 코드 :

public bool InitializeSockets() 
    { 
     try 
     { 
      IPAddress localaddr = LocalIPAddress(); 
      localep = new IPEndPoint(localaddr, 0); //(was port 50000); 


      //----------------------------------------------------------------- 
      // set up listener port for responses coming back on the same port 
      //----------------------------------------------------------------- 
      listener = new UdpClient(); 
      listener.ExclusiveAddressUse = false; 
      listener.Client.SetSocketOption(SocketOptionLevel.Socket, 
       SocketOptionName.ReuseAddress, true); 
      listener.Client.Bind(localep); 

      detailsOutputText = "Ready to listen on " + localep; 

      ustate = new UdpState(); 
      ustate.e = localep; 
      ustate.u = listener; 

      //------------------------ 
      // set up broadcast port 
      //------------------------ 
      bcast = new UdpClient(); 
      bcast.Client.SetSocketOption(SocketOptionLevel.Socket, 
       SocketOptionName.ReuseAddress, true); 
      bcast.Client.Bind(localep); 

      //------------------------------- 
      // start listening for responses 
      //------------------------------- 
      msgRxCallback = listener.BeginReceive(new AsyncCallback(DiscoveryCallback), ustate); 

      return true; 
     } 
     catch (Exception exc) 
     { 
      if (exc is SocketException) 
      { 
       // This only catches if another process has opened that port without sharing it 
       // or if firewall blocks it? 
       MessageBox.Show("Error opening IP address:Port : " + localep; 
      } 
      else 
       MessageBox.Show(exc.ToString()); 
      return false; 
     } 
    } 

감사

답변

2

두 가지 옵션 :

  1. 포트 번호를 포함하는 구성 파일을 만듭니다. 초기화시 config 파일을 읽고 클라이언트를 설정할 때 해당 포트 번호를 사용하십시오. 구성 파일에 기본 포트 번호를 제공하고 필요한 경우 고객에게 변경 방법에 대한 지침을 제공하십시오.
  2. 초기화시 수신자를 생성하고 매우 짧은 수신 제한 시간을주고 Receive으로 전화하십시오. 그러면 포트가 바인딩됩니다. 그런 다음 로컬 종점을 가져 와서 보낸 사람을 만들 때 사용할 수 있습니다. 수신 제한 시간 설정에 대해서는 Can I set the timeout for UdpClient in C#?을 참조하십시오.
+0

좋은 아이디어지만, # 2를 시도했지만 어떤 이유로 시작/끝이 수신 된 후에 포트 0으로 계속 돌아옵니다 ... –

+0

좋아요 .. localep이 변경되지 않았지만 얻을 수 있습니다. listener.Client.LocalEndPoint를 사용하여 포트. 감사. –

관련 문제