簡體   English   中英

TCP連接丟失時引發錯誤

[英]Getting Error thrown when TCP connect lost

我有一段代碼“監聽” TCP端口上的代碼,無論發送什么,它都只發送回一個字符串。 問題是客戶端只是在測試以查看端口是否處於活動狀態,然后斷開連接。 這時我拋出了一個錯誤。 無法訪問已處置的對象對象名稱:'System.Net.Socket.NetworkSystem'

我認為問題在於此代碼在線程上,並且當連接關閉時,while循環引用已處置的對象...當客戶端關閉連接時,如何防止觸發錯誤?

  //Cretae listener to accept client connections
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer
        int bytesRcvd; // Received byte count
        while (ServiceRunning)  // Run forever, accepting and servicing connections
        {
            try
            {
                // Receive until client closes connection, indicated by 0 return value
                int totalBytesEchoed = 0;

//I THINK THIS IS WHERE THE PROBLEM IS .. THE CLIENTSTREAM.READ???

                while (((bytesRcvd = clientStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) && (ServiceRunning))
                {
                    clientStream.Write(responseBytes, 0, responseBytes.Length);
                    WriteEventToWindowsLog("GSSResponderService", "Received "+System.Text.Encoding.UTF8.GetString(rcvBuffer), System.Diagnostics.EventLogEntryType.Information);
                    totalBytesEchoed += bytesRcvd;
                }

                WriteEventToWindowsLog("GSSResponderService", "Responded to " + totalBytesEchoed.ToString() + " bytes.", System.Diagnostics.EventLogEntryType.Information);


                // Close the stream and socket. We are done with this client!
                clientStream.Close();
                tcpClient.Close();

            }
            catch (Exception e)
            {
//THIS IS GETTING TRIGGERED WHEN A CONNECTION IS LOST
                WriteEventToWindowsLog("GSSResponderService", "Error:" + e.Message, System.Diagnostics.EventLogEntryType.Error);
                clientStream.Close();
                tcpClient.Close();
                break;
            }
        }
    }

根據MSDN, NetworkStream類的Read方法在基礎Socket關閉時引發IOException ,在NetworkStream關閉或從網絡讀取失敗時引發ObjectDisposedException Write方法會引發相同的異常。

因此,應該足以捕獲這兩種異常類型並在異常處理程序中采取適當的措施。

    TcpClient tcpClient = (TcpClient)client;
    NetworkStream clientStream = tcpClient.GetStream();

    byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer
    int bytesRcvd; // Received byte count
    while (ServiceRunning)  // Run forever, accepting and servicing connections
    {
        try
        {
            // Receive until client closes connection, indicated by 0 return value
            int totalBytesEchoed = 0;

            try
            {
                while (((bytesRcvd = clientStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0) && (ServiceRunning))
                {
                    clientStream.Write(responseBytes, 0, responseBytes.Length);
                    WriteEventToWindowsLog("GSSResponderService", "Received "+System.Text.Encoding.UTF8.GetString(rcvBuffer), System.Diagnostics.EventLogEntryType.Information);
                    totalBytesEchoed += bytesRcvd;
                }
            }
            catch(IOException)
            {
                //HERE GOES CODE TO HANDLE CLIENT DISCONNECTION
            }
            catch(ObjectDisposedException)
            {
                //HERE GOES CODE TO HANDLE CLIENT DISCONNECTION
            }

            WriteEventToWindowsLog("GSSResponderService", "Responded to " + totalBytesEchoed.ToString() + " bytes.", System.Diagnostics.EventLogEntryType.Information);


            // Close the stream and socket. We are done with this client!
            clientStream.Close();
            tcpClient.Close();

        }
        catch (Exception e)
        {
            WriteEventToWindowsLog("GSSResponderService", "Error:" + e.Message, System.Diagnostics.EventLogEntryType.Error);
            clientStream.Close();
            tcpClient.Close();
            break;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM