2012-12-18 67 views
2

因此,我已經收到了大約一個星期的異常,並且最終設法將它轉換爲可輕鬆讀取的代碼片段。當關閉連接時,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.S.我有a blog post一般描述了一些更常見的套接字錯誤和套接字錯誤處理。

+0

嗯,我花了一段時間來確認這是答案,但它是。感謝您的答覆 :) – riwalk

相關問題