2012-12-18 11 views
2

약 1 주일 동안이 예외가 발생했으며 마침내 쉽게 읽을 수있는 코드 스 니펫으로 처리 할 수있었습니다.연결을 닫을 때 WindowsRT StreamSocket 예외가 발생합니다.

배경으로 저는 Windows RT 용 응용 프로그램을 프로그래밍 중이며 기본 소켓을 사용하려고합니다.

테스트를 위해 서버 역할을하는 로컬 소켓 수신기를 만들었습니다. 서버와 클라이언트 모두 소켓에서 읽기/쓰기가 가능해야합니다.

클라이언트와 서버 모두 어느 정도의 데이터가 유선을 통해 전송되는지 (또는 알고 있어야하는지) 알 수 없습니다. 이것은 절대적인 요구 사항입니다. 서버는 필요할 때 임의의 양의 데이터를 처리 할 수 ​​있어야합니다. 여기

는 일례이다. 그것은 단위 테스트로 제시되는데, 그 이유는 그것이 내가 일관되게 오류를 만나는 이유이기 때문입니다.

[TestMethod] 
    public async Task TestSomething() 
    { 
     // Setup local server 
     // 
     StreamSocketListener listener = new StreamSocketListener(); 
     listener.ConnectionReceived += async (sender, args) => 
     { 
      DataReader serverReader = new DataReader(args.Socket.InputStream); 
      await serverReader.LoadAsync(4096); // <-- Exception on this line 
     }; 

     await listener.BindServiceNameAsync("10181"); 

     // Setup client 
     // 
     using (StreamSocket socket = new StreamSocket()) 
     { 
      await socket.ConnectAsync(new HostName("localhost"), "10181"); 

      DataReader reader = new DataReader(socket.InputStream); 
      Task readTask = Listen(reader); 
     } 
    } 

    public async Task Listen(DataReader reader) 
    { 
     await reader.LoadAsync(4096); 
    } 

예외는 서버가 LoadAsync(...)를 호출하는 라인에서 발생하고, 단위 테스트가 종료 할 때 예외가 발생합니다 :이 예에서 단일 선을 제거하면 오류가 사라됩니다.

예외이다 (겉보기) 간단한 : 기존 연결이 원격 호스트에 의해 강제로 폐쇄되었다

. (HRESULT의 예외 : 0x80072746)

모든 단서는 크게 감사하겠습니다.

답변

4

새로운 WinRT 소켓 유형을 사용하면 소켓을 올바로 프로그래밍하는 것이 훨씬 쉬워졌지만 실수는하지 않았습니다. 여전히 복잡한 짐승입니다.

"강제 종료"(WSAECONNRESET/10054) 오류는 원격 쪽 (이 경우 클라이언트)이 연결을 중단 할 때 발생하며 그 오류는 해당 StreamSocket을 삭제하여 발생합니다. 이것은 오류로보고되지만 드문 일이 아니며 정상적으로 처리되어야합니다. 즉, 서버가 모든 데이터를 보내고 더 많은 (선택적) 데이터를 받기를 기다리고 있다면 WSAECONNRESET을 일반 닫기로 처리해야합니다.

팁 : Exception.HResultSocketError.GetStatus으로 전달하면 SocketErrorStatus.ConnectionResetByPeer이 표시됩니다. 그렇게하면 오류 처리 코드에서 마술 값을 피할 수 있습니다.

P. 좀 더 일반적인 소켓 오류 및 소켓 오류 처리 일반적으로 설명하는 a blog post있다.

+0

글쎄, 이것이 대답인지 확인하는 데는 시간이 걸렸지 만 그렇습니다. 당신의 응답을 주셔서 감사합니다 :) – riwalk

관련 문제