【发布时间】: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