Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C/C++ Сетевое программирование
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2015, 15:22   #1
ladari
Новичок
Джуниор
 
Регистрация: 28.03.2015
Сообщений: 3
По умолчанию Клиент-сервер C++

"При запуске нескольких экземпляров клиента, каждый экземпляр должен получить данные".

Можете, пожалуйста, объяснить как именно я должен это обеспечивать? Нужна ли тут многопоточность?

Я использую сокеты. Для клиента создаю сокет и для сервера.

Последний раз редактировалось ladari; 28.03.2015 в 15:30.
ladari вне форума Ответить с цитированием
Старый 28.03.2015, 15:31   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Стоп-стоп-стоп.
Ты читаешь книгу, ты про сокеты блокирующие и неблокирующие прочитал?
Многопоток нужен для блокирующих сокетов, хотя как правило многопоток делают везде, чтоб много подключений обрабатывал.
И порты тут ни при чем - все подключения могут идти через один порт. Функция accept() возвращает сокет очередного подключения, и вот тут то можно стартовать поток, передавая ему этот сокет для работы с ним. После чего основная программа продолжает прослушивать порт, пока не сработает очередной accept().
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.03.2015, 16:06   #3
ladari
Новичок
Джуниор
 
Регистрация: 28.03.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Стоп-стоп-стоп.
Ты читаешь книгу, ты про сокеты блокирующие и неблокирующие прочитал?
Многопоток нужен для блокирующих сокетов, хотя как правило многопоток делают везде, чтоб много подключений обрабатывал.
И порты тут ни при чем - все подключения могут идти через один порт. Функция accept() возвращает сокет очередного подключения, и вот тут то можно стартовать поток, передавая ему этот сокет для работы с ним. После чего основная программа продолжает прослушивать порт, пока не сработает очередной accept().
Спасибо за ответ. Немного начал разбираться. В книге почему-то нет разделения на блокирующие и неблокирующие.

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

Я так понял, что у меня должно быть два разных проекта. Один для сервера и один для клиента.

А можно еще один вопрос?

Мне нужно отследить изминения в папке на диске. Тоесть, клиент подключается к серверу и если в папке были изминения, то он должен ему сообщить.

Я нашел метод FindFirstChangeNotification. Просто я никак не пойму. Изминения я должен учитывать в то время, когда запускается exe сервера? А что если эту папку кто-то изменит, когда сервер не будет запущен?

Я только начинаю разбираться с клиент-сервером, поэтому пока не до конца все понимаю.
ladari вне форума Ответить с цитированием
Старый 28.03.2015, 16:19   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Я так понял, что у меня должно быть два разных проекта. Один для сервера и один для клиента.
Не обязательно, но так будет проще.
Цитата:
А что если эту папку кто-то изменит, когда сервер не будет запущен?
Так в этом задача? Мониторить изменения в каталогах?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.03.2015, 16:23   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Тоесть, клиент подключается к серверу и если в папке были изминения, то он должен ему сообщить.
Клиент должен сообщить серверу про изменения папке?
Цитата:
Изминения я должен учитывать в то время, когда запускается exe сервера?
Или сервер сообщать клиенту?

В любом случае никакой FindFirstChangeNotification тебе не поможет. Тебе надо запоминать состояние файлов в каталоге и периодически сверять текущее состояние с сохраненным. Я бы создал таблицу типа "имя файла, хеш файла" и сверял с ней.

Статьи по теме (для работы с потоками и сетью используется библиотека Qt) :
Работа с сетью. Клиент-сервер. - описаны классы для работы с сетью, при этом сервер работает в одном потоке.
Многопоточный сервер - описана работа с потоками и очень удобная обертка над сокетами (с шаблоном "декоратор").

Где-то там же была статья про работу с базами данных была (удобно использовать для хранения хешей файлов между запусками программы какой-нибудь SQLite)
rrrFer вне форума Ответить с цитированием
Старый 28.03.2015, 16:33   #6
ladari
Новичок
Джуниор
 
Регистрация: 28.03.2015
Сообщений: 3
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Клиент должен сообщить серверу про изменения папке?

Или сервер сообщать клиенту?

В любом случае никакой FindFirstChangeNotification тебе не поможет. Тебе надо запоминать состояние файлов в каталоге и периодически сверять текущее состояние с сохраненным. Я бы создал таблицу типа "имя файла, хеш файла" и сверял с ней.

Статьи по теме (для работы с потоками и сетью используется библиотека Qt) :
Работа с сетью. Клиент-сервер. - описаны классы для работы с сетью, при этом сервер работает в одном потоке.
Многопоточный сервер - описана работа с потоками и очень удобная обертка над сокетами (с шаблоном "декоратор").

Где-то там же была статья про работу с базами данных была (удобно использовать для хранения хешей файлов между запусками программы какой-нибудь SQLite)
Сервер должен сообщать клиенту. В задании Qt использовать нельзя. Можно только MFC и Windows API.

За идею про изминения в файлах спасибо. Но, там нужно запоминать любые изминения в папке. А если изменится имя файла или файл вообще удалится. Значит, тогда нужно имена еще запоминать. А в FindFirstChangeNotification есть параметры - FILE_NOTIFY_CHANGE_FILE_NAME и т.д. Но все равно Ваша идея правильнее, так как у меня не получалось контролировать изминения, когда exe не запущен.

Спасибо.
ladari вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отправить видео захват(с веб-Кам.) Клиент->Сервер->Клиент RODNOC Мультимедиа в Delphi 17 03.10.2010 22:31
Клиент->Сервер->Клиент RODNOC Работа с сетью в Delphi 0 25.09.2010 11:49
сервер+клиент+клиент на телефон Razyiller Работа с сетью в Delphi 3 01.04.2010 20:10
Возможно-ли Клиент-серверное приложение типа Клиент(Pascal) а сервер(CGI)? Demol Работа с сетью в Delphi 1 21.04.2009 16:18