c#套接字丢失数据

Xen*_*ate 1 c# sockets

我有以下代码来读取从服务器发送到客户端的消息:

while (true) {
    byte[] readBuffer = new byte[327680];
    StringBuilder message = new StringBuilder(327680);
    while (true) {
        do {
            int bytes = ServerStream.Read(readBuffer, 0, readBuffer.Length);
            message.AppendFormat("{0}", Encoding.ASCII.GetString(readBuffer, 0, bytes));
        }
        while (ServerStream.DataAvailable);

        if (message.Length > 0) {
            foreach (string msg in message.ToString().Split(MESSAGE_END)) {
                if (msg != "") ProcessServerMessage(msg);
            }
            message.Clear();
            readBuffer = new byte[327680];
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

不幸的是......时不时变量'消息'似乎都会被切断,我无法理解.我已经把读取缓冲区变得很大,看看是不是问题,但它没有帮助.这似乎发生在服务器一次发送大量数据时,但是在327680字节附近...

此外,在检查服务器日志时,它似乎完全发送数据,未切断.这就像有一半的信息在互联网上丢失了......但这是TCP,所以这不应该发生,对吧?

提前致谢

Chr*_*rle 7

它没有丢失,你没有正确地进行缓冲读取.即使您正在检查DataAvailable,也可能是发件人尚未刷新该数据.所以它"正在路上"(等待发送),但DataAvailable会因为尚未到达而返回false.

最好在数据之前发送一个整数,以便接收方知道要预期的数据量,或者寻找某种终结符(null,换行符,某些东西).