Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我捕捉到客户端超时的SocketException时,服务器上会发生什么?_C#_Sql Server_Sockets_Tcplistener - Fatal编程技术网

C# 当我捕捉到客户端超时的SocketException时,服务器上会发生什么?

C# 当我捕捉到客户端超时的SocketException时,服务器上会发生什么?,c#,sql-server,sockets,tcplistener,C#,Sql Server,Sockets,Tcplistener,我正在用.NETFramework4.6.2和C开发一个套接字服务器和一个客户端 在服务器上,我在数据库中执行操作,并使用存储过程更新表 在客户机上,我发送数据以更新数据库 在客户端因超时而出现套接字异常之前,一切正常。之后,我会在数据库更新时出错。存储过程不会失败,但不会影响其工作。换句话说,它返回0,因为我已在存储过程中检查该行已更新,但该行尚未更新: set @commFlag = (Select CommissioningFlag from Code where CodeId = @co

我正在用.NETFramework4.6.2和C开发一个套接字服务器和一个客户端

在服务器上,我在数据库中执行操作,并使用存储过程更新表

在客户机上,我发送数据以更新数据库

在客户端因超时而出现套接字异常之前,一切正常。之后,我会在数据库更新时出错。存储过程不会失败,但不会影响其工作。换句话说,它返回0,因为我已在存储过程中检查该行已更新,但该行尚未更新:

set @commFlag = (Select CommissioningFlag from Code where CodeId = @codeId);

if (@commFlag = @newCommFlagValue)
begin
    return 0;
end
else
    return -1;
这里,存储过程返回0,但如果我从SSMS上的CodeId=@CodeId的代码中选择CommissioningFlag,它将返回CommissioningFlag的上一个值

我已修复了在收到超时SocketException时在客户端执行重置的问题:

private SynchronousSocketClient trzCodeReceiverClient;

[ ... ]
try
{
    trzCodeReceiverClient.SendData(dataFrame, out dataReceived);
}
catch (SocketException ex)
{
    dataReceived = Resources.ErrorSocketTrzCodeReceiver;

    RestartSocket();
}
catch (Exception ex)
{
    dataReceived = Resources.ErrorSocketTrzCodeReceiver;

    RestartSocket();
}
和RestartSocket方法:

SynchronousSocketClient就是这样

但我认为这不是正确的方法。我不想做RestartSocket。可能服务器超时后处于不稳定状态,或者我不知道

你知道这里发生了什么吗

我认为问题可能是我没有等待服务器的响应,因为抛出了IsocketException


服务器类或多或少是这样的。

我已在存储过程中检查该行已更新,但该行尚未更新。您能澄清这句话吗?@默认值是,我已在该句话之后添加了执行此操作的SQL代码。您能包含服务器端侦听器的源代码吗?TCP/IP如何处理关闭可能有点棘手。除非修改类以更改SendTimeout属性,否则您得到的超时不应该是由SendData方法引起的?默认值是无限的超时期。相反,可能是SqlCommand导致了异常,因为默认情况下它的超时时间是30秒:我个人也会切换到标准解决方案,如httpclient和owin服务器,但这是另一个讨论:-。这应该通过服务器上的try-catch轻松确定。@Dag在哪里可以找到有关HttpClient和Owin服务器的详细信息?这里的问题是,我们使用的是Cognex的摄像头,我认为他们只使用插座。我开发了一个socket客户端来模拟Cognex的摄像头。超时是由于存储过程造成的,它会有更多的时间来完成工作。SqlCommand也在try-catch中。我更改Socket.ReceiveTimeout,它没有使用默认值。我设置的值取决于我正在进行的测试,因为有时我会使用6秒的ReceiveTimeout进行测试,以避免出现此异常。我已在存储过程中检查该行已更新,但该行尚未更新。您能澄清这句话吗?@Default Yes,我在这句话之后添加了一段SQL代码,可以包含服务器端侦听器的源代码吗?TCP/IP如何处理关闭可能有点棘手。除非修改类以更改SendTimeout属性,否则您得到的超时不应该是由SendData方法引起的?默认值是无限的超时期。相反,可能是SqlCommand导致了异常,因为默认情况下它的超时时间是30秒:我个人也会切换到标准解决方案,如httpclient和owin服务器,但这是另一个讨论:-。这应该通过服务器上的try-catch轻松确定。@Dag在哪里可以找到有关HttpClient和Owin服务器的详细信息?这里的问题是,我们使用的是Cognex的摄像头,我认为他们只使用插座。我开发了一个socket客户端来模拟Cognex的摄像头。超时是由于存储过程造成的,它会有更多的时间来完成工作。SqlCommand也在try-catch中。我更改Socket.ReceiveTimeout,它没有使用默认值。我设置的值取决于我正在进行的测试,因为有时我会使用6秒的ReceiveTimeout进行测试,以避免此异常。
private void RestartSocket()
{
    if (trzCodeReceiverClient != null)
        trzCodeReceiverClient.EndConnection();

    NameValueCollection section =
        ConfigurationManager.GetSection("TRZCodeReceiverSection") as NameValueCollection;

    string trzCodeReceiverHost = section["host"];
    int trzCodeReceiverPort = int.Parse(section["port"]);
    int receiveTimeOut = int.Parse(section["receiveTimeOut"]);

    trzCodeReceiverClient = new SynchronousSocketClient(
                    trzCodeReceiverHost,
                    trzCodeReceiverPort,
                    receiveTimeOut);

    trzCodeReceiverClient.EstablishConnection();
}