c # — отправить файл через SOCKET

Я создаю простой сервер Socket. Приложение Flex будет клиентом для этого сервера. По специальному запросу мне нужно передать файл изображения (JPEG) с сервера на клиент через сокет.

Я уже написал сервер на C # для целей тестирования — и он отлично работает с моим приложением flex.

Код C #, который отправляет изображение:

private void sendImage(Socket client)
{
Bitmap data = new Bitmap("assets/sphere.jpg");
Image img = data;
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] buffer = ms.ToArray();
sendInt(client, buffer.Length);
client.Send(buffer);
Console.WriteLine("Image sent");
}

C ++ код, который отправляет то же изображение:

void SocketServer::sendFile(SOCKET &client, std::string filename)
{
std::ifstream file (filename, std::ios::ate);
if (file.is_open())
{
std::ifstream::pos_type size = file.tellg();
char * memblock = new char [size];
file.seekg (0, std::ios::beg);
file.read (memblock, size);
file.close();
sendInt(client, size);
send(client, memblock, size, 0);
delete[] memblock;
}
}

send Метод возвращает правильный размер изображения в качестве отправленного значения.

По какой-то причине я не могу отладить в Adobe Flash Builder 4.6 в Windows 8, поэтому я создал выходной виджет, где я могу просмотреть результат передачи в виде строки

C # перенесенный результат:
введите описание изображения здесь

C ++ передаваемый результат:
введите описание изображения здесь

Как видите, примерно 500 первых символов одинаковы. Остальная часть C ++ — это символы «i». Странно то, что если я читаю файл в строку, используя этот код, например:

std::ifstream ifs("sphere.jpg");
std::string str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());

моя строка будет ~ 500 символов вместо 124 КБ (~ 124 000 символов, размер файла изображения).

Вот результат C ++ изображения:
введите описание изображения здесь

Так что я не знаю, почему передача сокетов только очень малая часть jpeg правильно а остальное не так? Как я уже говорил, проблем с переносом байтового массива из C # во Flex нет, поэтому я предполагаю, что на стороне Flex все в порядке.

2

Решение

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

std::ifstream file (filename, std::ios::ate | std::ios::binary);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector