2017-03-03 8 views
0

How to peek StreamSocket for data in UWP appsで尋ねるように、データを閲覧する方法が見つかりませんでした私自身の "覗き見"を作るが、まだ運がない。UWP StreamSocketでは、タイムアウトでデータを読み込み、タイムアウトが経過しても接続を開いたままにすることはできますか?

タイムアウトを使用し、タイムアウトが経過した場合に接続を使用できるようにする方法で、StreamSocketからデータを読み取る方法がわかりません。

最後に、問題は次のとおりです。私の場合、IMAPクライアントは、サーバーから応答を受け取り、この応答が否定的な場合は、サーバーがただちに別の応答を送信するかどうかを少し調べる必要があります(場合によっては、コネクションを閉じるためのゼロパケットであってもよい)。サーバーが別の応答を送信しなかった場合、私は問題なく、メソッドを終了して呼び出し元に戻ります。呼び出し側はストリームにさらにデータを送り、より多くの応答を受け取ることができます。

したがって、要求を送信して初期応答を得た後、非常に小さなタイムアウト間隔でもう一度ソケットを読み取る必要があります。データは到着し、何もしません。

答えて

1

CancelationTokenSourceを使用すると、タイムアウトを生成して非同期操作を停止できます。 DataReaderは、StreamSocketの入力ストリームからのデータを消費します。少なくとも1バイトのデータがある場合、そのLoadAsync()メソッドが返されます。ここでは、1秒後に非同期タスクをキャンセルし、データが消費されていない場合にDataReader.LoadAsync()を停止するキャンセルソースを追加します。

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をチェックすると、同じ目的のために他のコードで既に使用していることがわかりました。数か月前に既にこのタスクを既に解決していることを完全に忘れてしまったようです。Unbelievable .. – Alex

関連する問題