在c#客户端/服务器程序中从服务器发送的数据在客户端收到时更改

时间:2010-09-17 06:20:50

标签: c# network-programming

服务器端代码:

byte[] size = new byte[4];
size = BitConverter.GetBytes(fileData.Length);
stream.Write(size, 0, 4);

客户端代码:

byte[] size = new byte[4];
ReadWholeArray(s, size);
int fileSize = BitConverter.ToInt32(size, 0);

ReadWholeArray方法的定义:

public static void ReadWholeArray(Stream stream, byte[] data)
{
    int offset = 0;
    int remaining = data.Length;
    while (remaining > 0)
    {
        int read = stream.Read(data, offset, remaining);
        if (read <= 0)
            throw new EndOfStreamException
                (String.Format("End of stream reached with {0} bytes left to read", remaining));
        remaining -= read;
        offset += read;
    }
}

程序从服务器发送fileData.Length(此实例的值为2422)。在客户端接收到该数据时,接收数据的值为-772097985 为什么在没有改变价值的情况下没有收到发送的数据?有什么问题?

2 个答案:

答案 0 :(得分:2)

好的,开始的简单诊断:在两端记录字节数组的各个内容,这样你就可以看到那里发生了什么。

通过这种方式,您可以查看通信协议中是否存在损坏的二进制数据,或BitConverter是否导致您的问题。例如,您可以在一端使用big-endian BitConverter,在另一端使用little-endian BitConverter。这似乎不太可能,但它是可能的 - 特别是如果你的服务器或客户端之一运行Mono而不是.NET本身。

如果确实成为问题,您可能希望使用MiscUtil中的EndianBitConverter类,它可以指定字节顺序。

如果问题出在通信层,您可能希望安装Wireshark以查看网络级别发生的情况。例如,你确定你已经阅读了你想要阅读的所有数据吗? (如果在此之前只读取了15个字节,并且大小写在偏移量16处,那么显然你将首先获得“额外”字节。)

答案 1 :(得分:0)

这很好用:

private void button2_Click(object sender, RoutedEventArgs e)
{
    MemoryStream ms = new MemoryStream();
    byte [] original = BitConverter.GetBytes((int)2224); // 176, 8, 0, 0
    ms.Write(original, 0, original.Length);
    ms.Seek(0, SeekOrigin.Begin);
    byte [] data = new byte[4];
    int count = ms.Read(data, 0, 4); // count is 4, data is 176, 8, 0, 0
    int fileSize = BitConverter.ToInt32(data, 0); // is 2224
    return;
}

你可以使用WireShark或其他东西截取字节吗?你使用什么样的连接?是否可以发送更多数据(即流开头的telnet控制字符)?你可以调试每一端并验证这些值或将字节数组内容写入日志文件吗?顺便说一句:“byte [] size = new byte [4];”是浪费,因为BitConverter.GetBytes()返回一个新数组。