StreamSocket API を使用してサーバーへのストリーミング接続を行う Windows 8/WinRT 用に作成しているアプリケーションがあります。つまり、サーバーはメタ タグを使用してクライアントにデータをストリーミングし、いつでも切断できます。
私が抱えている問題は、サーバーがいつ切断されたかを検出する方法がわからないことです。入力ストリームまたは出力ストリームのいずれかである StreamSocket クラス、または接続ステータスと関係のある DataReader/DataWriter クラスには、イベントやプロパティはないようです。
その上、サーバー側がクライアントから切断された後、DataReader メソッド ReadAsync は失敗しません。代わりに、私が知る限り、操作は成功し、バッファに書き込まれるデータは、サーバーが最後に送信したものです (つまり、「消費された」ことがわかりますが、内部バッファをクリアしていません)。 ReadByte を呼び出すたびにバッファー)。後続の ReadAsync への呼び出しごとにこれを行います - サーバーが切断される前に最後に送信したものでバッファーを補充します。コードの簡略版は次のとおりです。
public async Task TestSocketConnectionAsync()
{
var socket = new StreamSocket();
await socket.ConnectAsync(new HostName(Host), Port.ToString(),
SocketProtectionLevel.PlainSocket);
var dr = new DataReader(socket.InputStream);
dr.InputStreamOptions = InputStreamOptions.Partial;
this.cts = new CancellationTokenSource();
this.listenerOperation = StartListeningAsync(dr, cts);
}
public async Task StartListeningAsync(DataReader dr, CancellationTokenSource cts)
{
var token = cts.Token;
while (true)
{
token.ThrowIfCancellationRequested();
var readOperation = dr.LoadAsync(1024);
var result = await readOperation;
if (result <= 0 || readOperation.Status != Windows.Foundation.AsyncStatus.Completed)
{
cts.Cancel(); // never gets called, status is always Completed, result always > 0
}
else
{
while (dr.UnconsumedBufferLength > 0)
{
byte nextByte = dr.ReadByte();
// DriveStateMachine(nextByte);
}
}
}
}