Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# 服务中的tcp连接出现问题_C#_Sockets_Tcp - Fatal编程技术网

C# 服务中的tcp连接出现问题

C# 服务中的tcp连接出现问题,c#,sockets,tcp,C#,Sockets,Tcp,我创建了一个从特定客户机接收数据的服务。这很好,我收到了我想要的大部分数据。然而,在连接2-4小时后,我在StreamReader.ReadLine上得到了这个错误,在这个错误发生后,服务开始占用90-99%的cpu,并且只能使用cmd和Taskkill关闭 System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭了现有连接。-->System.Net.Sockets.SocketException:远程主机强制关闭了现有连接 位于System.Net.Sockets

我创建了一个从特定客户机接收数据的服务。这很好,我收到了我想要的大部分数据。然而,在连接2-4小时后,我在StreamReader.ReadLine上得到了这个错误,在这个错误发生后,服务开始占用90-99%的cpu,并且只能使用cmd和Taskkill关闭

System.IO.IOException:无法从传输连接读取数据:远程主机强制关闭了现有连接。-->System.Net.Sockets.SocketException:远程主机强制关闭了现有连接 位于System.Net.Sockets.Socket.Receive(字节[]缓冲区、Int32偏移量、Int32大小、SocketFlags和SocketFlags) 位于System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32大小) ---内部异常堆栈跟踪的结束--- 位于System.Net.Sockets.NetworkStream.Read(字节[]缓冲区,Int32偏移量,Int32大小) 在System.IO.StreamReader.ReadBuffer()处 在System.IO.StreamReader.ReadLine()中

连接的代码:

    static readonly object _lock = new object();
    List<Task> _connections = new List<Task>();
    private static string strConn;
    private static int _port;

    public async Task connectClients()
    {
        TcpListener ServerSocket = new TcpListener(IPAddress.Any, _port);
        ServerSocket.Start();

        while (true)
        {
            TcpClient client = await ServerSocket.AcceptTcpClientAsync();
            var task = handle_clients(client);

            if (task.IsFaulted)
                task.Wait();

        }
    }

 private async Task handle_clients(TcpClient client)
    {
        var connectionTask = HandleConnectionAsync(client);

        lock (_lock)
            _connections.Add(connectionTask);

        try
        {
            await connectionTask;
        }
        catch (Exception ex)
        {
            new LogWriter(ex.ToString());
        }
        finally
        {
            // remove pending task
            lock (_lock)
            {
                _connections.Remove(connectionTask);
                client.GetStream().Close();
                client.Close();
            }

        }
    }  
    private async Task HandleConnectionAsync(TcpClient client)
    {
        await Task.Yield();
        NetworkStream stream = client.GetStream();
        StreamReader reader = new StreamReader(stream);
        while (true)
        {
            try
            {                    
                string data = reader.ReadLine();
                if (!string.IsNullOrWhiteSpace(data))
                {
                    Thread t = new Thread(() => DatabaseFix(data));
                    t.Start();
                }
            }
            catch (Exception ex)
            {
                new LogWriter(ex.ToString());
                break;
            }


        }

    }
静态只读对象_lock=new object();
列表_连接=新列表();
私有静态字符串strConn;
专用静态int_端口;
公共异步任务connectClients()
{
TcpListener ServerSocket=新的TcpListener(IPAddress.Any,_port);
ServerSocket.Start();
while(true)
{
TcpClient client=await ServerSocket.AcceptTcpClientAsync();
var任务=处理客户(客户);
if(task.IsFaulted)
task.Wait();
}
}
专用异步任务句柄\u客户端(TcpClient客户端)
{
var connectionTask=HandleConnectionAsync(客户端);
锁
_connections.Add(connectionTask);
尝试
{
等待连接任务;
}
捕获(例外情况除外)
{
新的日志编写器(例如ToString());
}
最后
{
//删除挂起的任务
锁
{
_连接。移除(connectionTask);
client.GetStream().Close();
client.Close();
}
}
}  
专用异步任务HandleConnectionAsync(TcpClient客户端)
{
等待任务;
NetworkStream=client.GetStream();
StreamReader=新的StreamReader(流);
while(true)
{
尝试
{                    
字符串数据=reader.ReadLine();
如果(!string.IsNullOrWhiteSpace(数据))
{
线程t=新线程(()=>DatabaseFix(数据));
t、 Start();
}
}
捕获(例外情况除外)
{
新的日志编写器(例如ToString());
打破
}
}
}
因此,无论出于何种原因,当连接关闭时,我期望会发生什么,它应该关闭连接,然后获得一个新连接


这可能是客户端和服务之间的某个internet错误“防火墙”吗?在这种情况下,可能会出现什么错误?

对于被询问的人。问题是客户端一直在发送连接并再次关闭它们,直到它有任何数据要发送为止。客户端连接出错时,我的代码未关闭networkstream

将我的HandleConnectionAsync更改为此

 try
        {
            using (var stream = client.GetStream())
            using (var reader = new StreamReader(stream))
            {
                while (true)
                {
                    var data = await reader.ReadLineAsync();
                    if (string.IsNullOrEmpty(data))
                    {
                        break;
                    }
                    DatabaseFix(data);

                }
            }
        }
        catch (Exception ex)
        {
            new LogWriter(ex.ToString());
        }

是的,当连接丢失时,您需要处理重新打开。网络连接断开的原因不止几个(编程控制之外)。我脑子里最想做的就是无线续租。此外,有时数据包被拆分,您将需要处理一条消息,而不是一条消息全部到达。(还有一个提示:通过网络,最好直接从套接字读取-避免流缓冲,这基本上只会增加另一层传输干扰。)当我收到错误时,连接被关闭。代码应该关闭客户端,因为该代码是如何使用的?然后客户端将自动通过TcpListener重新连接?如果我在出错后重新启动服务,客户端可以再次连接,但是如果我不重新启动它,客户端就永远不会再连接。有什么不同吗?因为tcplistener总是在那里?