2015-09-03 84 views
0

我目前正在尝试做一个小型服务器,但我遇到了一个问题,我相信是一个僵局。而我的问题是如何真正避免C#Tcp中的死锁问题?让我给你看一些东西。C# - 如何避免使用TcpClient死锁?

 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#网络中意味着什么?

+0

死锁是死锁。所有语言都一样。 http://stackoverflow.com/questions/8064296/is-deadlock-possible-when-locking-one-global-object-in-asp-net-mvc-application – Eser

+0

这不是一个死锁,它是一个无效的通信协议。当双方沟通时,messgaes的形成方式被终止,消息的确切顺序称为协议。要想出一个不会导致此类问题的有效协议,请研究一些现有的协议(如HTTP)以获得此想法。 –

+1

是什么让你觉得呢? AcceptString永远不会返回这个特定的代码,因为连接永远不会被发送者关闭。这不是一个僵局。 – usr

回答

2

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

+0

谢谢!我虽然这是死锁,因为我的服务器只接受第一个字符串并忽略其他字符串。 – Valli3