Socket连接发送数据失败
Socket connection fails to send data
我有一个很长的 运行 TCP 连接。一台机器(物联网设备)与服务器建立连接,建立连接(加密和其他东西)并存储数据,连接保持打开一段时间。
一切正常,但有时服务器 'drops' 连接出错:
已建立的连接被主机中的软件中止(代码:10053 - ConnectionAborted)。但连接并未断开,因为服务器可以在错误发生后从设备读取数据,并且可以重新开始发送。如果连接真的断开了,服务器和客户端都需要重新初始化连接(安全和东西)。
没有真正说明无法写入网络流的原因。
轮询套接字表明它是可写的,在下一点它会抛出异常。似乎是随机发生的。
public class ClientIdentifier
{
...
public TcpClient Connection { get; set; }
public BlockDecoder ConnectionDecoder { get; set; }
}
private void ReplyToClient(ClientIdentifier client, byte[] data)
{
byte[] encrypted = client.ConnectionDecoder.Encrypt(data);
var stream = client.Connection.GetStream();
int dataIndex = 0;
while (dataIndex != encrypted.Length)
{
if (CanWriteClient(client))
{
byte[] block = encrypted.GetChunk(dataIndex, Frame.BLOCK_LENGTH);
stream.Write(block, 0, Frame.BLOCK_LENGTH);
dataIndex += Frame.BLOCK_LENGTH;
}
}
}
private bool CanWriteClient(ClientIdentifier client)
{
try
{
return client.Connection.Client.Poll(1000, SelectMode.SelectWrite);
}
catch (Exception ex)
{
Logger.Warn(ex, $"[{client.HexIdentifier}]: Polling client write failed");
return false;
}
}
编辑 (12.11.2017)
服务器:192.168.1.150
设备:192.168.1.201
我可以看到当服务器以某种奇怪的方式重置 Seq 和 Ack 时设备发送 RST。
设法找到错误。超时设置得太低了。
...
TcpClient client = server.EndAcceptTcpClient(ar);
int timeout = (int)TimeSpan.FromSeconds(3).TotalMilliseconds;
client.ReceiveTimeout = timeout;
client.SendTimeout = timeout;
...
我有一个很长的 运行 TCP 连接。一台机器(物联网设备)与服务器建立连接,建立连接(加密和其他东西)并存储数据,连接保持打开一段时间。
一切正常,但有时服务器 'drops' 连接出错: 已建立的连接被主机中的软件中止(代码:10053 - ConnectionAborted)。但连接并未断开,因为服务器可以在错误发生后从设备读取数据,并且可以重新开始发送。如果连接真的断开了,服务器和客户端都需要重新初始化连接(安全和东西)。
没有真正说明无法写入网络流的原因。 轮询套接字表明它是可写的,在下一点它会抛出异常。似乎是随机发生的。
public class ClientIdentifier
{
...
public TcpClient Connection { get; set; }
public BlockDecoder ConnectionDecoder { get; set; }
}
private void ReplyToClient(ClientIdentifier client, byte[] data)
{
byte[] encrypted = client.ConnectionDecoder.Encrypt(data);
var stream = client.Connection.GetStream();
int dataIndex = 0;
while (dataIndex != encrypted.Length)
{
if (CanWriteClient(client))
{
byte[] block = encrypted.GetChunk(dataIndex, Frame.BLOCK_LENGTH);
stream.Write(block, 0, Frame.BLOCK_LENGTH);
dataIndex += Frame.BLOCK_LENGTH;
}
}
}
private bool CanWriteClient(ClientIdentifier client)
{
try
{
return client.Connection.Client.Poll(1000, SelectMode.SelectWrite);
}
catch (Exception ex)
{
Logger.Warn(ex, $"[{client.HexIdentifier}]: Polling client write failed");
return false;
}
}
编辑 (12.11.2017)
服务器:192.168.1.150 设备:192.168.1.201
我可以看到当服务器以某种奇怪的方式重置 Seq 和 Ack 时设备发送 RST。
设法找到错误。超时设置得太低了。
...
TcpClient client = server.EndAcceptTcpClient(ar);
int timeout = (int)TimeSpan.FromSeconds(3).TotalMilliseconds;
client.ReceiveTimeout = timeout;
client.SendTimeout = timeout;
...