2013-11-16 2 views
0

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

while((sent = read(fp, send_buf, BUFSIZE)) > 0) 
{ 
    write(cssock, send_buf, strlen(send_buf)); 
    memset(send_buf, 0, BUFSIZE); 
} 

и я читаю его на клиенте как:

while(readBytes = read(sock, file_data, BUFSIZE) > 0) 
{ 
     write(fp, file_data, strlen(file_data)); 
} 

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

привет меня зовут abcd garbage-char

garbage-char - некоторый арбитральный характер. Любая идея, почему я получаю такой дополнительный характер?

примечание: я проверил дважды файл, и у него ничего нет, кроме строки «мое имя - abcd». Нет места, нет новой линии. Любая помощь приветствуется.

+0

какой дополнительный символ вы получаете? – yanchong

+0

его дополнительный байт. Я не могу вставить его здесь. Квадрат с таким, как показано ниже: 0F – mihirj

+1

Предлагаю вам распечатать свой send_buf на вашем сервере, а ваш файл_данные в клиенте - посмотреть, одинаковы ли они. Кроме того, используйте memset (send_buf, 0, BUFSIZE) перед тем, как прочитать свой файл на сервере, и memset (filedata, 0, BUFSIZE), прежде чем читать из сокета на клиенте. – yanchong

ответ

1

Актуальной проблемой была POSIX read() API. Он не возвращает строку с завершающим символом NULL, которая заполняет символы буфера в буфере.

Что я сделал, чтобы решить эту проблему ниже:

while((sent = read(fp, send_buf, BUFSIZE - 1)) > 0) 
{ 
    if(sent < BUFSIZE) 
     send_buf[sent] = '\0'; 
    else 
     send_buf[BUFSIZE] = '\0'; 

    write(cssock, send_buf, strlen(send_buf)); 
    memset(send_buf, 0, BUFSIZE); 
} 

и решить ее. Спасибо всем за вашу помощь.

+0

Действительно старый, комментируя это, но не может не видеть, что если 'read()' возвращает код ошибки с отрицательным числом, вы будете писать вне массива. –

1

Я предлагаю вам распечатать свой send_buf на вашем сервере, а ваши файлы_файлов в клиенте - посмотреть, являются ли они одинаковыми. Кроме того, используйте memset (send_buf, 0, BUFSIZE) перед тем, как прочитать свой файл на сервере, и memset (filedata, 0, BUFSIZE), прежде чем читать из сокета на клиенте.

+0

Я отмечаю это как ответ, так как это решило мою проблему. – mihirj

+0

Он работает для небольшого файла, но для большого файла он все еще вызывает проблемы с символами мусора. Я решил это и опубликую как ответ. – mihirj

2

Решение здесь прост. Используйте длину полученных данных, а не длину строки. Вы не получили строку. Вы получили произвольный блок байтов, который может быть любым значением от 0 до 255. Таким образом, strlen может возвращать бесполезные результаты. Но количество прочитанных байтов всегда точно.

Смежные вопросы