【问题标题】:C# - How to avoid deadlock using TcpClient?C# - 如何使用 TcpClient 避免死锁?
【发布时间】:2015-09-03 19:06:07
【问题描述】:

我目前正在尝试制作一个小型服务器,但我遇到了一个问题,我相信是一个死锁。我的问题是如何真正避免 C# Tcp 中的死锁问题?让我给你看点东西。

        public static void SendString (TcpClient klient, string message) {
        byte[] byteBuffer = Encoding.UTF8.GetBytes(message);
        NetworkStream netStream = klient.GetStream();
        netStream.Write(byteBuffer, 0, byteBuffer.Length);
        netStream.Write(new byte[] { separator }, 0, sizeof(byte));
        netStream.Flush();
    }

    public static string AcceptString (TcpClient klient) {
        List<int> buffer = new List<int>();
        NetworkStream stream = klient.GetStream();
        int readByte;
        while ((readByte = stream.ReadByte()) != 0)
            buffer.Add(readByte);

        return Encoding.UTF8.GetString(buffer.Select<int, byte>(b => (byte)b).ToArray(), 0, buffer.Count);
    }

当双方尝试调用SendString()(彼此)时会发生死锁吗?如果不是,究竟是什么导致了死锁?我的意思是我知道什么是死锁(当双方都在等待对方的行动时),但它在 C# 网络中的实际含义是什么?

【问题讨论】:

  • 死锁就是死锁。在所有语言中都是一样的。 stackoverflow.com/questions/8064296/…
  • 不是死锁,是无效的通信协议。当双方通信时,消息的形成、终止以及消息的确切顺序称为协议。要提出一个不会导致此类问题的有效协议,请研究一些现有协议(如 HTTP)以了解这个想法。
  • 是什么让你这么想? AcceptString 将永远不会返回此特定代码,因为发送者永远不会关闭连接。这不是僵局。

标签: c# networking tcpclient tcplistener


【解决方案1】:

您的情况没有死锁。至少我什么都看不到。为什么要有一个?
每台计算机都可以将任意数量的数据发送到另一台计算机。数据将存储在目标计算机的网络接收缓冲区中,直到某个软件获取它。一般情况下,数据发送不受其他数据接收的影响。

【讨论】:

  • 谢谢!我认为这是死锁,因为我的服务器只接受第一个字符串而忽略了其他字符串。
猜你喜欢
  • 1970-01-01
  • 2013-06-07
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多