2012-03-06 3 views
1

У меня возникли проблемы с отправкой файла 140KB изображения folowing по сети с помощью сокетов:Отправка изображения по сети с помощью сокетов, испортили данные

original image

Начало файла получает переданы правильно, то остальные испортится приводит к следующему результату:

messed up image

у меня есть сервер, который ожидает файлов и клиент, который подключается к серверу и запускает файл Tranfer. Когда клиент закрывает соединение, сервер знает, что файл был отправлен и сохраняет его.

Все данные на стороне сервера собираются в списке байт (GLOBAL.FILE_BUFFER), перед записываются в файл:

public void OnDataReceived(IAsyncResult asyn) 
    { 
     try 
     { 
       SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
       int iRx = socketData.m_currentSocket.EndReceive(asyn); 

       for (int f = 0; f < iRx; f++) 
       { 
        GLOBAL.FILE_BUFFER.Add(socketData.dataBuffer[f]); // Collect all the incoming data into a buffer 
       } 

       WaitForData(socketData.m_currentSocket, socketData.socket_id, REQUEST_INDEX_ID); 
     } 
     catch (ObjectDisposedException) 
     { 

     } 
     catch (SocketException se) 
     { 

     } 
    } 

Это код, я использую для записи в файл:

 public static void ByteArrayToFile(string _FileName, byte[] _ByteArray, int BytesRead) 
    { 
     System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write); 
     _FileStream.Write(_ByteArray, 0, BytesRead); 
     _FileStream.Close(); 
    } 

Я использовал ту же самую функцию ByteArrayToFile на стороне фективного и сохранил изображение правильно. Похоже, что клиент отправляет правильные данные, но когда сервер их получает, он становится испорченным. Я сохранил файл на обоих концах, клиентом и сервером, а затем сравнили их:

enter image description here

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

Я не понимаю, как это может произойти, так как я использую список и просто добавляю в список байтов, пока не появится ничего не осталось читать !? Если у вас нет решения, можете ли вы дать мне какие-нибудь советы? Эта проблема прослушивала меня в течение нескольких недель, хотелось бы, чтобы она поняла окончательно. Благодаря!

+0

Вы проверили данные в байте [], который вы отправляете, совпадают с байтом [], сгенерированным изображением? Отправьте код, который генерирует байт [] –

+0

@Ramhound Извините, я не уверен, что вы имеете в виду. Клиент извлекает изображение из Интернета, а затем загружает его на сервер. Когда я собираю все данные в списке байтов на стороне клиента из httpwebresponse, я сохраняю изображение, чтобы убедиться, что оно действительно, и оно сохраняется и работает. Пожалуйста, дайте мне знать, если это ваш вопрос. Благодаря! – user1192403

ответ

1

Можете ли вы рассказать о своих проблемах с данными, в чем проблема? Является ли сервер просто отбрасыванием байтов или повреждены данные? Сколько данных передано правильно?

Рассмотрите возможность использования чего-то вроде Wireshark, чтобы исследовать байты, когда они сошли с провода. Это должно помочь вам определить, является ли это сетевой ошибкой или чем-то в вашем коде сервера.

+0

Спасибо за предложение. Из того, что я могу сказать, первые 40% попадают правильно, тогда оттуда большинство данных перепутано, а не просто в сегментах (например, первые 1024 байта в порядке, а затем беспорядок), но он перепутался на уровне байта, например, 10 байт в порядке , два байта не совпадают и т. д. – user1192403

+0

также, если я тестирую более крупное изображение, меньший процент отправляется правильно, а остальное перепутано. Почти кажется, что первый сегмент (1024 байта) всегда идеален, но затем он беспорядок его потом, что является странным. – user1192403

+0

Возможно, вы захотите попробовать распечатать размер буфера приема ('iRx'), когда вы получите пакет. Если это соотносится с тем, где начинается повреждение данных, возможно, что вы удаляете данные во время копирования в свой файловый буфер. – TMN