2011-12-21 7 views
0

У меня есть этот код:Ошибка при получении файла

while (1) { 
    char buffer[4096]; 
    memset(buffer,0,4096); 
    int bytes_read = recv(client_fd, buffer, sizeof(buffer),0); 
    if (bytes_read == 0) 
     break; 
    if (bytes_read < 0) { 
     std::cout<< "Error "<<endl; 
    } 
    void *p = buffer; 
    int dest; 
    dest=open("/root/hello.txt",O_WRONLY); 
    while (bytes_read > 0) { 
     int bytes_written = send(dest, buffer, bytes_read,0); 
     if (bytes_written <= 0) { 
      std::cout<< "Error2 "<<endl; 
     } 
     bytes_read -= bytes_written; 
     p += bytes_written; 
    } 
} 

я получаю файл правильно. Программа переходит в цикл, где cout является «Error2», поэтому send возвращает -1. Проблема заключается в том, чтобы записать файл в новый файловый дескриптор, в этом случае переменная называется dest. Как я могу решить эту проблему?

+0

Разве вы не должны передавать сокет fd в качестве первого параметра ['send'] (http://pubs.opengroup.org/onlinepubs/007904975/functions/send.html)? –

+1

Почему вы используете 'send' для записи в обычный файл? (Особенно в C++ ?!) И почему вы не проверяете 'errno' после' send' возвращает '-1'? Кажется, проще спросить 'perror', чем попросить StackOverflow. , , – ruakh

+0

Ваш цикл сохраняет повторное открытие файла, каждый раз, когда новый дескриптор открывается в начале файла. И он никогда не закрывает его, поэтому он теряет дескрипторы. –

ответ

2

Согласно the manual-page for send(2), он может записывать только в сокет, а не в обычный файл; если вы проверили errno (используя, например, perror), вы бы увидели, что он установлен в ENOTSOCK. Вы всегда должны видеть , что ошибка, в противном случае отладка просто снимается в темноте.

Кроме того, поскольку это C++, я действительно думаю, что вы должны использовать ввод-вывод типа C++ (std::ofstream и т. Д.) Для записи в обычный файл.

+0

Хорошо спасибо. Это лучшее решение для C++. – user1056635

0

Проверьте возвращаемое значение

dest=open("/root/hello.txt",O_WRONLY); 

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

+0

Возвращаемое значение val равно -1. Я пробовал также с O_RDWR. Как я могу это решить? – user1056635

+0

@ user1056635: Что он устанавливает 'errno'? – ruakh

+0

Ну ... Я только что решил проблему, используя соответствующую функцию для C++, ofstream. – user1056635

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