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