2011-08-29 607 views
6

我的應用程序正在作爲銀行服務器的客戶端應用程序工作。應用程序正在發送請求並獲得銀行的響應。本申請通常工作正常,但有時由於線程退出或應用程序請求導致I/O操作中止

的I/O操作已經由於線程退出或 如995的應用請求

錯誤,錯誤代碼快到的中止。

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", 
             ref swReceivedLogWriter, strLogPath, 0); 
    try 
    { 
     SocketPacket theSockId = (SocketPacket)asyn.AsyncState; 

     int iRx = theSockId.thisSocket.EndReceive(asyn); //Here error is coming 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

    } 
} 

一旦此錯誤開始來爲所有交易後同樣的錯誤開始出現,所以 請幫我理清這個問題。如果可能的話,然後用一些示例代碼

問候, 阿希什Khandelwal

+0

很少有Windows錯誤與描述性和可靠性一樣。我們無法幫助您找到過早終止的線程。如果找不到,請在代碼中添加一些跟蹤。 –

回答

9

995是由IO Completion Port報告一個錯誤。自從嘗試從最可能關閉的套接字繼續讀取時,會出現此錯誤。

EndRecieve接收0字節意味着套接字已關閉,EndRecieve將拋出大多數例外。

您需要開始處理這些情況。

永遠不要忽略異常,它們會被拋出是有原因的。

更新

沒有什麼,說服務器做任何事。由於空閒連接被交換機/路由器/防火牆等關閉,連接可能會丟失,原因很多。網絡故障也會發生。

我在說的是你必須處理斷開連接。這樣做的正確方法是放置套接字並嘗試以特定間隔連接新套接字。

至於接收回調的處理是這樣的(半僞代碼)更合適的方式:

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", ref swReceivedLogWriter, strLogPath, 0); 

    try 
    { 
     SocketPacket client = (SocketPacket)asyn.AsyncState; 

     int bytesReceived = client.thisSocket.EndReceive(asyn); //Here error is coming 
     if (bytesReceived == 0) 
     { 
      HandleDisconnect(client); 
      return; 
     } 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 

    try 
    { 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

     //do your handling here 
    } 
    catch (Exception err) 
    { 
     // Your logic threw an exception. handle it accordinhly 
    } 

    try 
    { 
     client.thisSocket.BeginRecieve(.. all parameters ..); 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 
} 

的原因,爲什麼我用三個catch塊很簡單,因爲邏輯中間的一個與另外兩個不同。 BeginReceive/EndReceive異常通常指示套接字斷開連接,而邏輯異常不應阻止套接字接收。

+1

親愛的jgauffin,感謝您的迴應,但問題是隻有客戶端應用程序來自我們的公司,而服務器來自某個銀行,所以如果套接字從他們身邊關閉,那麼如何向他們表達這個問題是從他們身邊發出的,我們又該如何處理這個毫無例外,即因爲它拋出異常在endreceive我們可以寫任何命令,這將告訴我們,接收數據是0 – funsukvangdu

+1

閱讀我的更新。 – jgauffin

+0

@funsukvangdu:你還有什麼問題嗎? – jgauffin

4

我有與RS232通信相同的問題。原因是,你的程序執行速度比comport(或者慢速串行通信)快得多。

要修復它,我不得不檢查IAsyncResult.IsCompleted==true。如果沒有完成,則IAsyncResult.AsyncWaitHandle.WaitOne()

像這樣:

Stream s = this.GetStream(); 
IAsyncResult ar = s.BeginWrite(data, 0, data.Length, SendAsync, state); 
if (!ar.IsCompleted) 
    ar.AsyncWaitHandle.WaitOne(); 

大多數時候,ar.IsCompletedtrue

+0

這就像一個神奇的工作!謝謝 –

0

,當它發生了,我做的是禁用 COM端口到設備管理器再次啓用它。

它停止與另一個程序或線程的通信併爲您免費。

我希望這對你有用。問候。

0

我有這個問題。我認爲這是由於套接字打開引起的,沒有數據在打開後的短時間內到達。我正在讀取一個稱爲Devicemaster的串口到以太網盒。我將Devicemaster端口設置從「connect always」更改爲「connect on data」,問題消失。我非常尊重Hans Passant,但我不認同這是一個錯誤代碼,您可以通過仔細檢查代碼輕鬆解決。

相關問題