Отправка двоичного файла через сокет - PullRequest
0 голосов
/ 30 июня 2011

Я пытаюсь отправить двоичный файл через сокет в C на встроенную платформу, но когда я запускаю его после его отправки, он просто дает мне segfault (отправка через ftp работает нормально, но очень медленно).
Отправка бинарного файла в одной и той же системе работает нормально (встроенный является прямым порядком байтов, поэтому я не считаю его проблемой с прямым порядком байтов).
В чем может быть проблема?программа mft.cpp

1 Ответ

1 голос
/ 30 июня 2011

Предполагается, что каждый read возвращает количество байтов, которые вы хотите прочитать. Это неверно. Вы всегда должны проверять возвращаемое значение read, чтобы убедиться, что вы получили столько байтов, сколько хотели.

Это также означает, что вы можете переписать ваш цикл отправки как:

int bytesLeft = file_length;
char buf[1024]; //no need to reallocate it in the loop
while(bytesLeft > 0)
{
        int to_read = 1024;
        if(bytesLeft < to_read)
                to_read = bytesLeft 
        int bytesRead = read(new_sock_id, buf, to_read);
        if(error("reading file", false)) continue;
        write(file, buf, bytesRead);
        if(error("writing file", false)) continue;
        bytesLeft -= bytesRead ;
}
...