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를 시도했지만 어떤 이유로 시작/끝이 수신 된 후에 포트 0으로 계속 돌아옵니다 ... –
좋아요 .. localep이 변경되지 않았지만 얻을 수 있습니다. listener.Client.LocalEndPoint를 사용하여 포트. 감사. –