NetworkStream недостающие данные - PullRequest
4 голосов
/ 03 апреля 2012

Данные, о которых идет речь, представляют собой файл PNG с префиксом его размера как целое число.

-Sending:
ns.Write(BitConverter.GetBytes((int)data.Length),0,4);
ns.Write(data, 0, data.Length);

-Reading:
byte[] sizearray = new byte[4];
ns.Read(sizearray, 0, 4);
int dataSize = BitConverter.ToInt32(sizearray,0);

byte[] data = new byte[dataSize];
ns.Read(data, 0, dataSize);

Полученные данные затем сохраняются в файл. Я также пробовал это с BeginRead / EndRead с тем же результатом.

Проблема в том, что, хотя это работает для большинства изображений меньшего размера, оно не получает изображение размером более нескольких КБ. DataSize читает правильно, но после нескольких тысяч байтов каждый раз (~ 2900), остальные полученные данные равны 0. Пример

Я что-то упустил, например ограничение на количество отправляемых за один раз?

Ответы [ 2 ]

3 голосов
/ 03 апреля 2012

Вы игнорируете возвращаемое значение Read. Не делай этого. Read не ждет, пока прочитает все запрошенных вами данных. Вы должны читать в цикле, пока не прочитаете все, что вам нужно:

byte[] data = new byte[dataSize];
int index = 0;
while (index < dataSize)
{
    int bytesRead = ns.Read(data, index, dataSize - index);
    if (bytesRead <= 0)
    {
        // Or whatever exception you want
        throw new InvalidDataException("Premature end of stream");
    }
    index += bytesRead;
}

Теоретически, вы должны делать то же самое даже при чтении dataSize, хотя на практике я сомневаюсь , получите ли вы менее 4 байтов за одно чтение.

Возможно, вы захотите использовать BinaryReader, обернутый вокруг потока - тогда вы можете использовать ReadInt32 и ReadBytes, где ReadBytes сделает за вас цикл. (Вам все еще нужно проверить возвращаемое значение, но это будет проще, чем сделать это самостоятельно.)

1 голос
/ 03 апреля 2012
ns.Read(data, 0, dataSize);

Вот как минимум одна из ваших проблем: Read() возвращает количество прочитанных байт, не гарантируется, что прочитано dataSize байт.

Этот метод считывает данные в параметр буфера и возвращает количество успешно прочитанных байтов. Если нет данных для чтение, метод Read возвращает 0. Операция чтения читает столько же данные как есть, вплоть до количества байтов, указанных размером параметр.

...