StreamSocket API를 사용하여 서버에 스트리밍 연결을 수행하는 Windows 8/WinRT 용 응용 프로그램이 있습니다. 즉, 서버는 메타 데이터로 클라이언트에 데이터를 스트리밍하고 언제든지 연결을 끊을 수 있습니다.WinRT StreamSocket 처리 (서버 측과 클라이언트 측 모두)
내가 겪고있는 문제는 서버가 분리되었을 때이를 감지하는 방법을 모른다는 것입니다. StreamSocket 클래스에는 입력 스트림이나 출력 스트림 또는 연결 상태와 관련이있는 DataReader/DataWriter 클래스에 이벤트 나 속성이없는 것으로 나타납니다.
그 외에 서버 측이 클라이언트와의 연결을 끊으면 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);
}
}
}
}
알 수있는 좋은 정보입니다.고맙습니다. DataReader.ReadAsync 문제는 버그 인 것 같습니다. Microsoft 내에서 해당 팀이이를 인식하고 있으므로 해결 될 것으로 기대됩니다. 그 동안, 필자는 자신의 IBuffer (WindowsRuntimeBuffer.Create에서)에 대해 InputStream.ReadAsync를 호출하는 제안을 시도했지만 작동하지 않을뿐만 아니라 지연 시간이 눈에 띄게 줄어든 것으로 보입니다. –
이 (가)이 이전 게시물을 발견했습니다. @ JeremyBell이'InputStream.ReadAsync'에 대해 열어 본 사용자 음성 버그는 무엇입니까? 지금까지 해결 되었습니까? 나는 또한 입력 스트림에 이상한 행동을하는 것으로 보입니다. 서버에서 응답을 계속해서 쌓아 두어야합니다. 새 데이터를 서버에 보내기 전에 소켓에서 모든 데이터를 읽으 려합니다. http://stackoverflow.com/questions/27533703/how-to-read-all-the-available-data-from-a-winrt-streamsocket-and-empty-the-input?noredirect=1#comment43496033_27533703을 참조하십시오. – philk