2016-11-22 1 views
1

와 SocketActivityTriggerDetails에서 데이터를 가져 오기, 나는 소켓 브로커 내 백그라운드 작업에서 DatagramSocket로SocketActivityTrigger에서 수신 된 데이터를 검색하려고합니다.<a href="https://msdn.microsoft.com/en-us/windows/uwp/networking/network-communications-in-the-background" rel="nofollow noreferrer">MSDN</a>의 예에서 DatagramSocket로

그러나 링크의 예는 StreamSocket입니다 :

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails; 
    var socketInformation = details.SocketInformation; 
    switch (details.Reason) 
    { 
     case SocketActivityTriggerReason.SocketActivity: 
      var socket = socketInformation.StreamSocket; 
      DataReader reader = new DataReader(socket.InputStream); 
      reader.InputStreamOptions = InputStreamOptions.Partial; 
      await reader.LoadAsync(250); 
      var dataString = reader.ReadString(reader.UnconsumedBufferLength); 
      break; 
    } 
} 

나는, 우리는 출력 스트림에 액세스 할 수 DatagramSocket 객체에서 수신 된 데이터를 찾을 수 없습니다 ..

방법 할 수 있을까요?

감사합니다. 우리가 데이터를 수신 할 때 DatagramSocket 객체의 경우

답변

0

내가 DatagramSocket로 객체에서 수신 된 데이터를 찾을 수 있습니다, 우리는 출력 스트림에 액세스 할 수 없습니다 ..

, 우리는 fitstly의를 등록해야 MessageReceived event을 입력 한 다음 DatagramSocketMessageReceivedEventArgsGetDataReader method을 사용하여 전송 된 데이터를 가져올 수 있습니다.

백그라운드 작업의 경우 코드는 official Socket activity trigger stream socket sample과 유사합니다. 그러나 DatagramSocket의 경우이 MessageReceived 이벤트를 등록하고 백그라운드 작업의 데이터를 처리해야합니다.

그냥 여기 예를 들어 :

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var deferral = taskInstance.GetDeferral(); 
    try 
    { 
     var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails; 
     var socketInformation = details.SocketInformation; 
     switch (details.Reason) 
     { 
      case SocketActivityTriggerReason.SocketActivity: 
       var socket = socketInformation.DatagramSocket; 
       socket.MessageReceived += Socket_MessageReceived; 
       break; 
      default: 
       break; 
     } 
     deferral.Complete(); 
    } 
    catch (Exception exception) 
    { 
     ShowToast(exception.Message); 
     deferral.Complete(); 
    } 
} 

private void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) 
{ 
    using (var reader = args.GetDataReader()) 
    { 
     //TODO: read data here. 
    } 
} 
+1

@ grace-feng-msft 답장을 보내 주셔서 감사합니다.하지만 ** SocketActivityTrigger ** 뒤에 숨겨진 동작을 이해하지 못하는 것 같습니다. 사실 브로커 소켓은 포 그라운드에서 생성 한 DatagramSocket의 소유권을 가져오고 패킷을 받으면 백그라운드 작업을 시작합니다. 그래서 .. MessageReceived 이벤트에 가입 ** 너무 늦었습니다 **, 패킷이 이미 수신되었습니다 : ( –

+0

다른 사람이 나를 도울 수 있습니까? –

+0

@ApynAOM 당신이 이것을 해결할 수 있었습니까? –

0

당신은 EnableOwnerShip, bindServiceName 또는 bindEndPoint 후 TransferOwnerShip 메소드를 호출해야합니다. 나는이 주제에 대해 지금 일하고 있습니다.

관련 문제