Отправка файла через сокет в C - PullRequest
0 голосов
/ 08 декабря 2010

В школе я получил задание написать программу FTP на языке C (для Linux).Я получил все основные функции, работающие в кратчайшие сроки (ls, cd), но у меня проблемы с передачей файлов.Я использую sendfile для отправки файла через сокет следующим образом:

int fd = open(temp, O_RDONLY);  
int rc = sendfile (client_fd, fd, &offset, statbuf.st_size);

Не могу понять, как получить этот файл на стороне клиента.Я попробовал это для отладки следующим образом:

while( (i = read(sock, message, MSG_LEN - 1)) > 0 ) {

    message[i] = '\0';
    printf("%s", message);
}

Это хорошо работает при печати текстовых файлов, но если я пытаюсь, например, отправлять двоичные файлы, он просто печатает начало двоичного файлаи зависает в части read () (поскольку я думаю, что с сервера ничего не приходит).

Я ценю любые предложения!

1 Ответ

2 голосов
/ 08 декабря 2010

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

shutdown(client_fd, SHUT_WR);

(shutdown() используется вместо close(), чтобы вы могли узнать, успешно ли другая сторона получила весь файл или нет).

Тогда ваша сторона чтения увидит конец файла (read() возвращает 0), после чего он должен close() конец своего сокета. Сервер увидит конец файла и тоже сможет закрыть сокет (и записать успешную передачу).

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