다음은 시나리오입니다. 필자가 작성한 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를 통해 전송되고 있음을 확인했습니다.
나는 모든이 찾고 올바른에도 불구하고 (수신에 실패한) PC에서netstat -a
를 통해 출력이 라인
UDP [::]:50011 *.*
를 참조
, 내 PC는 단순히 OnMessageReceived
방법을하지 않습니다 (신비하게 작동하는 하나의 앱 제외). 이 이상한 행동을 일으킬 수있는 것은 무엇을 찾고 있습니까? 나는 그것이 실패 할지를 알기 위해 작업중인 응용 프로그램의 포트를 변경하려고했지만 시도하지 않았습니다. 또한 다른 태블릿에서이 앱을 실행하여이 PC인지 확인했지만 다른 태블릿에서도 동일한 결과를 얻었습니다. 앱이 멀티 캐스트 그룹에 가입하지 못했습니까? 이 메서드는 void
을 반환하므로 어떻게 알 수 있습니까?