Передача файлов через сокеты (Linux)
Модератор: Модераторы разделов
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Передача файлов через сокеты (Linux)
Сейчас разбираюсь с сокетами и возникла проблема, написал клиент,сервер для передачи строки, все работает отлично, тперь не могу понять как передать произвольный файл, имея только его местоположение.
Использовал функцию
int send(int sockfd, const void *msg, int len, int flags);
msg - указатель на буфер с данными, в него я подставлял массив чаров и все было ясно и понятно.
А как это сделать для файла?
Использовал функцию
int send(int sockfd, const void *msg, int len, int flags);
msg - указатель на буфер с данными, в него я подставлял массив чаров и все было ясно и понятно.
А как это сделать для файла?
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача файлов через сокеты (Linux)
Lostboy писал(а): ↑15.10.2009 00:45Сейчас разбираюсь с сокетами и возникла проблема, написал клиент,сервер для передачи строки, все работает отлично, тперь не могу понять как передать произвольный файл, имея только его местоположение.
Использовал функцию
int send(int sockfd, const void *msg, int len, int flags);
msg - указатель на буфер с данными, в него я подставлял массив чаров и все было ясно и понятно.
А как это сделать для файла?
man open, man read
Открываете файл, читаете в буффер данные и передаете их в сокет.
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
Спасибо. Ну хорошо, я разберусь с этим, допустим я передаю по 1024 байт файл, который состоит из 5Мб, все это в цикле...(вроде правильно понял идею)
А как этот файл будет формироваться на стороне сервера, он будет получать по частям этот файл и .. что дальше, куда и как он его сохранит? Можно ли определить директорию для сохранения?
А как этот файл будет формироваться на стороне сервера, он будет получать по частям этот файл и .. что дальше, куда и как он его сохранит? Можно ли определить директорию для сохранения?
-
- Сообщения: 1205
- ОС: Debian Wheezy (amd64)
Re: Передача файлов через сокеты (Linux)
ну дак точно также как и отправил... Только в обраттном порядке.
1. Создаешь и открываешь на запись файл (имя файла должен тоже передать) где тебе угодно
2. Читаешь пришедший из сети буфер
3. Скидываешь в файл....
4. пп2-3 до тех пор пока не придет метка окончания файла
Есть смысл рассчитывать контрольную сумму, так же ее присылать, и проверять на принимающей стороне. Кроме того если очень важна надежность то можно еще добавть счетчик пакетов.... Т.е передавать не просто кусок файла. А кусок файла в некоем совем обрамлении.
Например утрировано целый передаваемый блок:
[порядковый номер куска файла]
[кусок файла]
[контрольная сумма куска]
Естественно на принимающей стороне анализируешь правильность контрольной суммы и порядкового номера
То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
Спасибо сказали:
-
- Сообщения: 1205
- ОС: Debian Wheezy (amd64)
Re: Передача файлов через сокеты (Linux)
Кстати. По скольку уже (по минимуму) тебе надо передать два вида информации: имя файла и сам файл. И если передавать их отдельными пакетами. То в приведенную выше структуру напрашивается еще поле "Тип информации".......
Хотя можно пойти и другими методами.
Хотя можно пойти и другими методами.

То что не убивает нас, делает нас сильнее! © Ницше.
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
When life puts you in tough situations, don’t say "why me". Just say "try me © ?
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
-
- Сообщения: 1913
- Статус: zzz..z
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
Спасибо всем за ответы, разобрался, уже передал пару файлов - все работает, только одно НО после того как сервер принимает от клиента файл, он (файл) не совсем распознается системой, т.е. если это обычный тхт то при попытке его открыть вылетает меню "открыть с помощью", если это запускаемый файл то происходит нечто подобное, однако после того как я менял права вручную, все становилось на свои места. Вопрос: необходимо передавать еще и права или это можно решить как-нибудь по другому?
з.ы. чем отличается использование read/write через сокеты и sendfile через сокеты? Есть ли какие-то приемущества или недостатки, каков смысл применения той или иной связки?
з.ы. чем отличается использование read/write через сокеты и sendfile через сокеты? Есть ли какие-то приемущества или недостатки, каков смысл применения той или иной связки?
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Передача файлов через сокеты (Linux)
Lostboy писал(а): ↑15.10.2009 16:55Спасибо всем за ответы, разобрался, уже передал пару файлов - все работает, только одно НО после того как сервер принимает от клиента файл, он (файл) не совсем распознается системой, т.е. если это обычный тхт то при попытке его открыть вылетает меню "открыть с помощью", если это запускаемый файл то происходит нечто подобное, однако после того как я менял права вручную, все становилось на свои места. Вопрос: необходимо передавать еще и права или это можно решить как-нибудь по другому?
Права необходимо передавать, к примеру, сторокой следующего вида: "U:+rwx\nG:+rx-w\nO:-rwx" (эквивалентно 750 для chmod) и соответственно парсить эти данный, хотя можно отправлять все в бинарном виде (не кроссплатформенно)
Спасибо сказали:
-
- Сообщения: 1338
- Статус: We are all Kosh
- ОС: Fedora 10
Re: Передача файлов через сокеты (Linux)
Если использовать функции htons() <--> ntohs() то вполне кроссплатформенно.
LightLang Team
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
Не могу разобраться как парсить эти данные и потом цеплять их на новый файл. Нашел только что при создании файла можно задать атрибуты прав доступа и ls -l, chmod. У кого какие идеи, поделитесь?)
-
- Сообщения: 128
- ОС: Debian
Re: Передача файлов через сокеты (Linux)
Перед отправкой файла передаёте struct stat от передаваемого файла, а на стороне принимающего уже всё выставляете. А дальше chmod, chown и т.д. что надо будет.
Ну и читаете аналогично
Код: Выделить всё
struct stat st;
stat("file", &st);
send(s, (char*)&st, sizeof(st));
Ну и читаете аналогично
Спасибо сказали:
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
destr, спасибо, буду разбираться.
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
Работая с stat я получу права доступа для каждой группы, приблизительно в таком виде "-rw-r-r-", т.е. суть в том что у меня будут данные для каждого класса (user, group, other) по каждой операции (read, write, execute).
Как связать эти данные с функцией chmod или может какой-нибудь другой? Пока есть мысли только - использовать switch для разных раскладов и в зависимости от них запускать chmod с разными параметрами, но это много кода, вот и думаю есть ли более аккуратный вариант сделать это?
Как связать эти данные с функцией chmod или может какой-нибудь другой? Пока есть мысли только - использовать switch для разных раскладов и в зависимости от них запускать chmod с разными параметрами, но это много кода, вот и думаю есть ли более аккуратный вариант сделать это?
-
- Сообщения: 97
- ОС: по обстоятельствам :)
Re: Передача файлов через сокеты (Linux)
Ну так stat возвращает через буфер структуру с полем st_mode, которое в свю очередь является аргументом chmod.
http://www.opennet.ru/man.shtml?topic=stat...2&russian=0
http://www.opennet.ru/cgi-bin/opennet/man....&category=2
http://www.opennet.ru/man.shtml?topic=stat...2&russian=0
http://www.opennet.ru/cgi-bin/opennet/man....&category=2
Код: Выделить всё
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
//...
struct stat st;
stat(path1, &st);
mode_t st_mode = st.st_mode;
printf("%i\n", st_mode);
char *str = (char *) st_mode;
//
// тут строка передается через сеть
//
st_mode = (mode_t) str;
printf("%i\n", st_mode); // сдесь должно быть то же значение.
chmod(path2, st_mode);
die sheep! die to reverse the system
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
you accept (reject, respect);
next step,
kill next sacrifice, each sacrifice
Спасибо сказали:
-
- Сообщения: 33
- ОС: openSUSE/Mandriva
Re: Передача файлов через сокеты (Linux)
Не знал что chmod берет за аргумент st_mode...(
Спасибо огромное! Теперь все работает и благодаря stat убил двух зайцев через него и права вешаю и размеры файлов сравниваю!
Спасибо огромное! Теперь все работает и благодаря stat убил двух зайцев через него и права вешаю и размеры файлов сравниваю!