Передача файла JPEG между процессами в C - PullRequest
1 голос
/ 31 марта 2020

Я пишу сервер с клиентом, и у меня возникают проблемы с передачей изображений. Я попытался fread файл в буфере, чтобы отправить буфер клиенту и fwrite буфер в новый файл, и это сработало! Теперь он больше не работает, и я не знаю, почему, когда я проверяю новый файл, мой инструмент для открытия изображений говорит, что невозможно открыть файл JPEG и т. Д. c.
Мой код чтения:

int fd=open(pathname, O_RDONLY, 0666);
struct stat fileStat;
if(fstat(fd,&fileStat) < 0)   
{ 
    perror("\nfilestat\n");
    exit(-1);
}


int fileSize=(int)fileStat.st_size; 
//printf("File Size: \t\t%d bytes\n",fileSize);


FILE *f=fdopen(fd, "rb");
if(f==NULL)
{
    perror("\nfopen\n");
    exit(-1);
}

void *buf=malloc(fileSize);
if(buf==NULL)
{
    perror("\nmalloc\n");
    return -1;
}

int FR=fread(buf, fileSize, 1, f);

if(FR<0)
{
    perror("\nfread\n");
    exit(-1);
}

Затем я пишу тело на моем сервере сообщение:

punt+=sprintf(punt, "%s\r\n", (char *)buf);

И после того, как клиент извлек его из полученного сообщения, я пишу его в новый файл:

char *clientfile="./qui.jpg";               
int fdbis=open(clientfile, O_WRONLY|O_CREAT|O_TRUNC, 0666);

if(fdbis<=0)
{
    perror("\nopen 2\n");
    exit(-1);
}               

FILE *fbis=fdopen(fdbis, "wb");
if(fbis==NULL)
{
    perror("fdopen");
    exit(-1);
}


int WR=fwrite((void*)buf, strlen(buf), 1, fbis);
if(WR<=0)
{
    perror("\nfwrite\n");
    exit(-1);
}

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

Я программирую на C, используя систему Posix, и компилирую с помощью g cc.

Спасибо за внимание.

1 Ответ

0 голосов
/ 31 марта 2020

Поскольку файл jpeg является двоичным, вы не можете использовать строковую функцию для управления им. strlen(buf) вернет длину до первого нулевого завершения.

use memcpy.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...