2014-01-24 2 views
2

다음은 시나리오입니다. 필자가 작성한 P2P 네트워킹 기능이 포함 된 공통 DLL을 공유하는 5 개의 앱이 있습니다. 이러한 응용 프로그램 중 하나는 매번 완벽하게 작동하지만 다른 사람들은 다음과 같은 문제가 발생합니다.WinRT를 통해 UDP 멀티 캐스트에서이 동작을 설명 할 수 있습니까?

멀티 캐스트 방송에서 x86 기반 태블릿은 패킷을 제대로 보내고받을 수 있지만 x64 컴퓨터와 ARM 태블릿은 패킷 만 보낼 수 있습니다. 유일한 차이점은 다른 포트를 사용한다는 것입니다. 필자는 그것이 반드시 있어야한다고 생각하고, 테스트로 작동하는 응용 프로그램과 동일한 포트를 사용하도록 다른 응용 프로그램을 전환 해 보았습니다.하지만 그럴 필요는 없었습니다. 다음은 방송 시스템 설정을 처리하는 코드의 관련 부분입니다.

public async Task<bool> Startup() { 
    if (P2PNetwork.LocalUser == null || this._listenSocket != null) 
     return false; 

    ConnectionProfile connection = null; 

    //See note 1 below 
    bool gotConnection = TryGetValidNetworkConnection(out connection); 
    if(!gotConnection) 
     return false; 

    this._heartbeatTimer = ThreadPoolTimer.CreatePeriodicTimer(DoHeartbeat, TimeSpan.FromSeconds(10)); 

    var socket = new DatagramSocket(); 
    var stream = await socket.GetOutputStreamAsync(LANBroadcasting.MULTICAST_GROUP_ADDRESS, P2PNetwork.NetworkGroup.SendPort); 
    this._outStreamWriter = new DataWriter(stream); 

    this._listenSocket = new DatagramSocket(); 
    this._listenSocket.MessageReceived += OnMessageReceived; 
    await this._listenSocket.BindServiceNameAsync(P2PNetwork.NetworkGroup.ReceivePort, connection.NetworkAdapter); 

    this._listenSocket.JoinMulticastGroup(LANBroadcasting.MULTICAST_GROUP_ADDRESS); 

    DoHeartbeat(HeartbeatFlags.Ping); 

    return true; 
}  

주 1 : 이러한 증상은 5 가지 응용 프로그램 모두에서 발생했습니다. 그 당시 나는 인수없이 BindServiceNameAsync을 사용하고있었습니다. 방대한 연구 끝에이 접근 방식이 좋지 않았고 연결 프로필을 사용하는 Windows 8.1 방법이 더 안정적으로 작동한다고 제안하는 페이지를 발견했습니다. 프로필을 여러 번 확인하고 무선 LAN 프로필을 얻었습니다. 둘 모두에 맞습니다.

이 경우 (작동하지 않음) 태블릿의 송신 포트는 50011이고 수신 포트는 50010입니다. 멀티 캐스트 주소는 ff02 :: fb입니다 (IPv4도 시도했지만 변경 없음).이 경우 PC 그 반대입니다. 패킷이 Wireshark를 통해 전송되고 있음을 확인했습니다.

Wireshark Output

나는 모든이 찾고 올바른에도 불구하고 (수신에 실패한) PC에서 netstat -a를 통해 출력이 라인

UDP  [::]:50011  *.*

를 참조

, 내 PC는 단순히 OnMessageReceived 방법을하지 않습니다 (신비하게 작동하는 하나의 앱 제외). 이 이상한 행동을 일으킬 수있는 것은 무엇을 찾고 있습니까? 나는 그것이 실패 할지를 알기 위해 작업중인 응용 프로그램의 포트를 변경하려고했지만 시도하지 않았습니다. 또한 다른 태블릿에서이 앱을 실행하여이 PC인지 확인했지만 다른 태블릿에서도 동일한 결과를 얻었습니다. 앱이 멀티 캐스트 그룹에 가입하지 못했습니까? 이 메서드는 void을 반환하므로 어떻게 알 수 있습니까?

답변

0

벽에 머리를 두드리는 며칠 후, 마침내 대답을 얻었습니다. 이 문제가 발생하면 Windows 방화벽 설정으로 이동하여 연결되어있는 네트워크의 종류를 확인하십시오. 필자의 경우 Wi-Fi는 게스트/공용 네트워크였습니다. 분명히 이것은 "개인 네트워크"가 아니라 Windows 런타임에 의해 "인터넷"으로 간주된다는 것을 의미합니다. Package.appxmanifest에서 "개인 네트워크 (클라이언트 및 서버)"옵션을 선택했지만 하나의 애플리케이션을 제외하고 모두 "인터넷 (클라이언트 및 서버)"이 아닌 "인터넷 (클라이언트)"(아웃 바운드 액세스 만 제공) 어떤 이유로 일하고 있었어.

한 가지 이유 : x86 태블릿이 모든 앱에 대해 여전히 수신 할 수 있었던 이유는 여기에 설명되어 있지 않습니다. 나는 이것이 일종의 드라이버 결함이라고 생각할 수 있습니다.

이 간단한 설정은 간과하기 쉽기 때문에 일종의 경고 메시지가 나타납니다.

관련 문제