Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача файлов по TCP 
:(
    Опции темы
w32blaster
  Дата 11.12.2008, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 2.1.2006
Где: Tln/Slmae

Репутация: нет
Всего: нет



Здравствуйте всем. Прошу прощения, что воскресаю старый топик, но если я открою новый, то всяко меня отправят юзать поиск.

Проблема собсна у меня по сабжу. Снова лаба в универе, и снова трудно разобраться. Задание - сделать прогу, которая имитирует дейсвие ФТП-клиента и сервера. На практике это два скрипта, один за сервер, другой за клиент, и обмениваются сообщениями через сокет по TCP. Препод выложил нам два "исходника" - две проги, от которых мы можем отходить. Могу привести ссылки на них: 

postit.c
postit.h
postit_server.c

(сервер в Эстонии, если не будет качаться - скажите, перезалью).

Эти два примера просто обмениваются сообщениями.

Лично я на основе их реализовал функцию ls, то есть просмотр папок и фалов, quit, ну это легко, и cd смена папок. Вот. Осталось дело за малым - put и get. Вот тут-то я и застрял.

Собсна, вот мой и вопрос: как можно реализовать передачу фалов? Я в этом топике прочёл, что это нужно делать так же, как и сообщения. Это понятно. Но а поподробнее? Нужно файл считывать по 100 байт и перекидывать на сервер? А как тогда сервер их должен ловить? Ну то есть.... Вобщем, прошу примера или ссылки на толковый пример или туториал. А то не совсем понятно, как сервер получает сообщения. Если, скажем, отправлять клиент будет таким образом:

Код

FILE* f=fopen("c:\\myfile","w");
    if(f)
    {
        char szLine[] = "hi\r\n";
        write(сокет,strlen(szLine),1,f); 
        fclose(f);
    }


то как это же события будет обрабатывать сервер?

Вот... До сессии три недели.... прошу помощи, любой.... заранее благодарен.

Это сообщение отредактировал(а) Олег2005 - 11.12.2008, 14:58
PM MAIL WWW ICQ MSN   Вверх
vinick
Дата 11.12.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 9.6.2005

Репутация: 6
Всего: 22



Цитата(w32blaster @  11.12.2008,  12:09 Найти цитируемый пост)
как можно реалиовать передачу фалов?

сценарий для PUT
  • 1. Пользователь вводит команду "put myfile.txt"
  • 2. клиент проверяет наличие этого файла и получает его размер.
  •     2.1 если предыдущий пункт выполнен успешно, то на сервер отправляется команда "put myfile.txt размер_файла"
  •     2.2 в случае неудачи переход к п. 1
  • 3. Сервер получив команду "put myfile.txt размер_файла" создает в текущем каталоге файл myfile.txt и готовится принять "размер_файла" байт, которые будут записаны в открытый файл.
  • 4. клиент открывает файл myfile.txt, 
  •        4.1 Пока не достигнут конец файла читать блок данных из myfile.txt и отправлять на сервер.
  • 5. сервер читает из сокета данные до тех пор пока не прочитано "размер_файла" байт и записывает результат в myfile.txt
Для GET симметрично.

PM MAIL ICQ Jabber   Вверх
w32blaster
Дата 11.12.2008, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 2.1.2006
Где: Tln/Slmae

Репутация: нет
Всего: нет



Спасибо, добрый человек. smile  Работаем дальше...  Самую трудность для меня, с точки зрения кода, вызывает пункт 5  smile 

Это сообщение отредактировал(а) w32blaster - 11.12.2008, 15:44
PM MAIL WWW ICQ MSN   Вверх
J0ker
Дата 12.12.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



Цитата(vinick @  11.12.2008,  14:30 Найти цитируемый пост)
сценарий для PUT

не катит
что будем делать если посередине произошла ошибка чтения файла? разрывать соединение?
намного лучше передавать файл блоками с подтверждениями с другой стороны - вдруг там место закончилось или еще что-то случилось


--------------------
user posted image
PM MAIL   Вверх
antsh85
Дата 25.12.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



Привет,

Я туже лабу делаю. 

Сценарий: Client С & Server S

C->S do LS
S: LS response is 1000bytes = 3 packets
S->C  send to C total size of response (1000 bytes) sent (...)
S->C  send 3 packets  sent (...) x 3 

C<-S LS response size (1000 bytes)    -> recv(...)
C<-S 3 packets    (вот тут я получаю оборванные пакеты, потому что к тому времени когда клиент начнёт делать recv(...) сервер уже закончивает делать sent(...) )

Мне казалось что если сервер шлёт что то сокету, то это должно где то буфферится, до тех пор пока на стороне клиента не будет вызванно recv(...) Но я похоже не прав, как всё в дейсвительности?

Это сообщение отредактировал(а) antsh85 - 25.12.2008, 19:02
PM   Вверх
J0ker
Дата 26.12.2008, 02:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 1
Всего: 14



для TCP оно буферится
просто если recv вызван до того, как все данные дошли то recv возвращает тот кусок который уже пришел - вне зависимости как это было отправлено через send
данные надо собирать из кусков, либо выставить флаг MSG_WAITALL - тогда блокирующий recv заблокируется пока не будет заполнен буфер, либо закрыт сокет, либо не сорвет сигналом, либо не придет OOB

Это сообщение отредактировал(а) J0ker - 26.12.2008, 02:18


--------------------
user posted image
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0732 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.