2012-10-22 3 views
1

현재 WiFi를 통해 원격 임베디드 시스템과 통신해야하는 Windows 응용 프로그램에서 작업하고 있습니다. Windows 응용 프로그램은 원격 장치가 수신하는 브로드 캐스트 메시지를 보내고 보낸 사람 IP를 추출합니다. 그런 다음 원격 장치는 추출 된 IP에 응답을 보냅니다. 문제는 브로드 캐스트 메시지를 보낼 때 C#이 무선 네트워크 연결을 사용하지만 소켓을 열어 응답을 수신하거나 지정된 주소로 메시지를 보내는 경우 로컬 영역 연결을 사용하고 있다는 것입니다. 이러한 인터페이스에는 IP 주소가 다르므로 Windows 응용 프로그램에서는 원격지에서 응답을받지 못합니다.C#에서 소켓을 사용하는 활성 네트워크 인터페이스

내 질문에 C#이 다른 소켓에 다른 네트워크 인터페이스를 사용하고 프로그램이 모든 소켓에 동일한 인터페이스를 사용하도록하는 방법이 있습니까?

여기

sockB = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); //Create a UDP socket 
    sockB.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);  //Enable broadcast on socket 
    IPEndPoint briep = new IPEndPoint(IPAddress.Broadcast, 9584);       //Relate a port to the broadcast address  
    byte[] dat = { 0xAD, 0xEE, BRDCST_CMND, (byte)(0xAD^0xEE^BRDCST_CMND) };   //Put in buffer 
    sockB.SendTo(dat, briep);    //Broadcast data 

을 브로드 캐스트 메시지를 전송하는 코드를하고 여기에 리모트

sockC = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);     //Create an udp socket 
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1);     //set timeout to 5 ms 
    sockC.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.SendTimeout, 1); 
    IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9999);    //set up an "any" ip address and associate it with port 9854   
    EndPoint ep = (EndPoint)(iep);          //Make an endpoint out of previous association 
    sockC.Bind(iep);        //Bind the created socket to listen on port 9854 
    byteRecv = sockC.ReceiveFrom(data, ref ep);     //Receive on socke 

이 감사에서 답변에서 청취 코드입니다!

IPEndPoint iep = new IPEndPoint(IPAddress.Parse("wireless adapter IP here"), 9999); 

IPAddress.Any은, 지금까지의 내가 아는 한, 모든 청취한다 : 당신이 당신의 무선 어댑터에받을 강제하려면

+0

'로컬 영역 연결'이라고 말하면 유선 네트워크 연결이라고 생각하십니까? 무선은 또한 LAN에 연결할 수 있습니다. IP, 서브넷 마스크 및 게이트웨이가 올바르게 구성된 경우 연결을 자동으로 대상 주소로 라우팅 할 수 있어야합니다. –

+0

ipconfig에서 로컬 영역 연결이라는 네트워크 인터페이스를 의미합니다. 그것은 유선으로 라우터에 연결됩니다. IP, 서브넷 마스크 및 게이트웨이가 올바르게 구성되었는지는 모르겠지만 어떻게 확인할 수 있습니까? – user1765962

답변

0

은 무선 어댑터를 의미보다 구체적인 IPEndPoint로 설정 인터페이스를 사용하지만, 우선 순위가 가장 높은 프로토콜을 선택하는 것이 아니라 무선 어댑터에서 응답 패킷을 설정하는 방식으로 가져와야합니다. 위의 코드를 사용하여 강제로 시도해 볼 수 있습니다. 여전히 작동하지 않으면 응답 UDP 메시지가 어딘가에 삼키는 중입니다.

브로드 캐스트 메시지를 보내기 전에 응답을 수신하도록 소켓을 설정해야합니다. 그렇지 않으면 수신기가 설정되기 전에 실제로 응답이 오는 경쟁 조건이 발생할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 다른 네트워크 카드가 제대로 작동하지 않는다는 것을 깨달았습니다. 메시지가 올바른 네트워크 인터페이스 (리모컨과 다른 모든 통신을하는 메시지)에서 전송되도록 브로드 캐스트 대신 멀티 캐스트를 보내서 해결했습니다. – user1765962

관련 문제