C# 当我捕捉到客户端超时的SocketException时,服务器上会发生什么?
我正在用.NETFramework4.6.2和C开发一个套接字服务器和一个客户端 在服务器上,我在数据库中执行操作,并使用存储过程更新表 在客户机上,我发送数据以更新数据库 在客户端因超时而出现套接字异常之前,一切正常。之后,我会在数据库更新时出错。存储过程不会失败,但不会影响其工作。换句话说,它返回0,因为我已在存储过程中检查该行已更新,但该行尚未更新: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
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();
}