由于线程退出或应用程序请求,I / O操作已中止

时间:2011-08-29 10:06:34

标签: c# sockets exception

我的应用程序正在作为银行服务器的客户端应用程序。应用程序正在发送请求并从银行获得响应。这个应用程序通常工作正常,但有时

  

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);                    

    }
}

在相同错误开始出现后,所有交易都会出现此错误,所以 请帮我解决这个问题。如果可能,那么使用一些示例代码

此致 Ashish Khandelwal

5 个答案:

答案 0 :(得分:13)

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 :(得分:5)

我遇到了与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.IsCompleted都是true

答案 2 :(得分:0)

当发生这种情况时禁用将COM端口重新插入设备管理器并再次启用

它停止与其他程序或线程的通信,并为您免费。

我希望这适合你。问候。

答案 3 :(得分:0)

我有这个问题。我认为它是由套接字打开引起的,没有数据在打开后的短时间内到达。我正在从一个名为Devicemaster的串口到以太网盒中读取。我更改了设备管理器端口设置,从&#34;连接始终&#34; to&#34;连接数据&#34;问题消失了。我非常尊重Hans Passant,但我不同意这是一个错误代码,您可以通过仔细检查代码轻松解决。

答案 4 :(得分:-1)

对于我来说,该请求已超时。因此,您要做的就是增加创建HttpClient的时间。

HttpClient客户端=新的HttpClient();

client.Timeout = TimeSpan.FromMinutes(5);