Трудно сказать без подробностей - вы можете опубликовать какой-нибудь код?
Прежде всего, убедитесь, что вы открываете файл изображения с помощью двоичной опции , например, fopen (имя файла,"rb");
Если вы просто читаете двоичный файл и отправляете его в сокет, где другой конец ожидает двоичный файл, вам не нужно никакого приведения или sprintf.
Похоже, выпутать тип char со строками.Строка AC - это последовательность символов, оканчивающаяся нулями.Ваш файл изображения представляет собой двоичный файл, содержащий последовательность символов, но это не строка.Функция send () принимает указатель на последовательность байтов, а не на строки.Чтобы проиллюстрировать это, посмотрите на эту последовательность символов (или байтов):
255, 255, 255, 0, 0, 0, 255, 255, 255
В некоторых форматах файлов изображений это может быть три пикселя RGB, поэтому белый, черный белый.9 байт.Может храниться в буфере символов [9].Если вы вызовете strlen () для этого, вы получите результат 3. strlen () считается до тех пор, пока не увидит нулевой символ.Если вы читаете эти байты из файла без двоичного флага, он может трансформироваться, и вы можете получить меньше или больше байтов, чем на самом деле в файле (в зависимости от содержимого, ОС и т. Д.).
Грубые поясненияследующий код:
char buffer[1024];
FILE *infile = fopen("test.gif", "rb"); // open a file (check for failure in real code)
int nread = fread(buffer, 1, 1024, infile);
// assume socket is connected (check for number of bytes sent or error in real code)
send(socket, buffer, nread, 0);
fclose(infile); // close the file
Чтобы прочитать двоичный файл и отправить данные в сокет, вам нужно выполнить что-то вроде приведенного выше фрагмента.Вы, вероятно, продолжите чтение, пока не дойдете до конца файла, фрагмент читается только один раз.Также в реальном коде вы должны проверить, сколько байтов было фактически отправлено (в возвращаемом значении от send) и продолжать вызывать send, пока вы не отправите все данные или не произойдет ошибка.