2017-03-03 14 views
0

How to peek StreamSocket for data in UWP apps에서 묻는대로 데이터를 들여다 볼 수있는 방법이 없습니다. 내 자신의 "엿보기"를 만들지 만 여전히 운이 없다.UWP StreamSocket에서 시간 초과가 발생하면 데이터를 읽을 수 있고 시간이 초과되면 연결을 열어 둘 수 있습니까

타임 아웃을 사용할 수있는 방식으로 StreamSocket에서 데이터를 읽을 수있는 방법이 보이지 않으며 시간 초과가 발생할 경우 연결을 사용할 수 있습니다.

결국 문제는 다음과 같습니다. IMAP 클라이언트에서 서버로부터 응답을 받았다면이 응답이 부정적인 경우 서버가 즉시 다른 응답을 보냈는지 확인하기 위해 잠시 기다려야합니다 (때로는 서버가 추가 정보 오류 또는 연결을 닫는 0 패킷). 서버가 다른 응답을 보내지 않았다면, 나는 방금 메서드를 남겨두고 호출자에게 돌아온다. 호출자는 스트림에 더 많은 데이터를 보내고 더 많은 응답을받을 수 있습니다.

따라서 요청을 보내고 초기 응답을 얻은 후 매우 작은 시간 제한 간격으로 다시 한 번 소켓을 읽어야합니다. 데이터가 도착하면 아무것도하지 마십시오.

답변

1

CancelationTokenSource을 사용하면 제한 시간을 생성하고 비동기 작업을 중지 할 수 있습니다. DataReaderStreamSocket의 입력 스트림에서 데이터를 사용합니다. 적어도 1 바이트의 데이터가있을 때 LoadAsync() 메서드가 반환됩니다. 여기서는 데이터가 소비되지 않은 경우 DataReader.LoadAsync()를 중지하기 위해 1 초 후에 비동기 작업을 취소하는 취소 소스를 추가합니다.

var stream  = new StreamSocket(); 

var inputStream = stream.InputStream; 

var reader  = new DataReader(inputStream); 
reader.InputStreamOptions = InputStreamOptions.Partial; 

while(true) 
{ 
    try 
    { 
     var timeoutSource = new CancellationTokenSource(TimeSpan.FromSeconds(1)); 
     var data = await reader.LoadAsync(1).AsTask(timeoutSource.Token); 

     while(reader.UnconsumedBufferLength > 0) 
     { 
      var read = reader.ReadUInt32(); 
     } 
    } 
    catch(TaskCanceledException) 
    { 
     // timeout 
    } 
} 

DataReader를 삭제하면 스트림과 연결이 닫힙니다.

+0

감사합니다. 그러나 일단 DataReader가 끝나면 어떻게 제거 할 수 있습니까? 그러면 이전과 같은 상태에서 발신자에게 연결을 반환해야합니다. 이상적으로는 기존 연결에 연결하고 연결 수명 동안 여러 번 연결 해제 할 수 있어야합니다. – Alex

+1

DetachStream()을 사용하여 스트림에서 리더를 분리 할 수 ​​있습니다 (https://docs.microsoft.com/en-us/uwp/api/windows.storage.streams.datareader#Windows_Storage_Streams_DataReader_DetachStream). 이렇게하면 독자를 처분 할 때 스트림을 열린 상태로 유지할 수 있습니다. – Vincent

+0

아쉽게도 DataReader를 확인할 때 이미 다른 코드에서 똑같은 목적으로이 코드를 사용하고 있으며 몇 달 전에 이미이 작업을 이미 해결했음을 잊어 버린 것 같습니다. 믿을 수 없습니다. .. – Alex