Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/116: Рейтинг темы: голосов - 116, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118

Грамотная реализация клиент-серверного приложения

10.05.2009, 21:40. Показов 23261. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возник вопрос как грамотно реализовать клиент-серверное приложение под Linux'ом. Пока имеется стандартная реализация через потоковые сокеты. Но при некорректном завершении работы клиента сервер подвисает и умирает для внешних запросов. Здесь смысл почему так происходит понятен. Необходимо реализовать грамотную реализацию для устранения этой проблеммы. Слышал про не блокирующие сокеты. Но в эту сторону не хочу копать. Хочется реализовать с помощью процессов либо потоков. Вроде как с помощью функции fork можно делать при каждом запросе копию процесса и работать с каждым запросом в индивидуальном процессе. Либо можно реализовать с помощью потоков. Слышал, что понятие потоков и процессов в linux'е отличается от винды. Вот хочу дельный совет куда начать копать, чтобы не ошибиться маршрутом. Хочется реализовать грамотно и не сложно)). Заранее спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2009, 21:40
Ответы с готовыми решениями:

Прокомментировать код клиент-серверного приложения
Помогите в этом разобраться. Можете написать комментарии к коду пожалуйста Клиент #include<stdio.h> #include<stdlib.h>...

Реализация клиент-серверного соединения
Реализовать клиент-серверного соединения на основе протокола TCP. Клиентская часть должна обеспечивать передачу сообщения на сервер, а...

Реализация клиент-серверного взаимодействия на C#
Кто может поделится ссылкой на пример приложения на C#, 1-клиент(делает запросы в БД получает ответ в виде datatable, находится в...

31
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
10.05.2009, 22:01
можно форкаться при новом подключении
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
10.05.2009, 22:05  [ТС]
Меня тока смущает куча дочерних процессов. Если к серверу будет конектиться 10000 пользователей.
0
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
10.05.2009, 22:14
Ну а как ты предлагаешь?
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
10.05.2009, 22:16  [ТС]
Да черт знает))

Добавлено через 48 секунд
Я просто думаю может есть предпочтения как лучше. Или для одних задач одно для других другое...
0
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
10.05.2009, 22:26
можешь почитать книгу про сетевое программирование в линукс,можешь взять на самоучке
1
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
10.05.2009, 22:58  [ТС]
Блин в этом и смысл
Читать всю книгу сразу??
Или прочитать одну главу. Я хочу чтобы мне подсказали люди, которые писали программы такого типа и сталкивались с подобными вопросами.
А блин сказать скачай книгу и почитай я тоже могу. Написал же укажите в какую сторону копать, а не укажите какую книгу скачать.
0
 Аватар для Mecid
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,246
10.05.2009, 23:43
Ну вот я те и говорю форкайся и все буит ок!
а на счет книги,она именно про никсы,описывается много приемов.
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2009, 12:05
А в чём проблема на каждое соединение заводить отдельный сокет и опрашивать их все в цикле? При этом работу лучше всего вести через select (т.к. у него есть таймаут)

Добавлено через 42 секунды
Кстати, вкратце расскажи, что у тебя там делается, потому как в зависимости от поставленной задачи можно делать по разному

Добавлено через 6 минут 43 секунды
Возьми пример. Писал лет 100 назад
Делалось для следующих целей. В те времена irc-клиенты не умели работать через прокси сервер.
На машине запускалась эта прога. irc-клиент подключался к этой проге. Внутри проги делалось соединение с irc-сервером через прокси (хотя в теории любое TCP соединение). Прога умеет конектиться только к одному серверу (ибо чтобы конектиться к произвольному, надо чтобы от клиента пришла информация куда, но клиент думает, что он работает напрямую без проксей). Прога могла обслуживать несколько соединений. Подозреваю, что именно это тебе и нужно. ИНтересующий тебя код в процедуре bnc_Process
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2009, 12:06
Лучший ответ Сообщение было отмечено как решение

Решение

Прога
Вложения
Тип файла: rar bnc.rar (2.5 Кб, 1574 просмотров)
10
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
11.05.2009, 13:39  [ТС]
На самом деле клиент связывается с сервером, где в свою очередь передает данные библиотеки для работы с БД(Oracle). В принципе я понимаю, что в данном случае это не является критичным(число дочерних процессов). Это я в теории заговорил о тысячах дочерних процессах. Хочу просто грамотно, несложно и красиво все организовать. Пример кстати не помешает))

Добавлено через 5 минут 31 секунду
Осмыслил что хочу)) Структурную схему хочу. Какую-нибудь маленькую диаграмку, которая отражает основные этапы реализации. Может быть в книге какой-нибудь есть диаграмки??

Добавлено через 14 минут 6 секунд
Блин пример клевый, только виндовские функции работы с сокетами немного смущают)).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2009, 16:22
Цитата Сообщение от toxxin Посмотреть сообщение
Блин пример клевый, только виндовские функции работы с сокетами немного смущают)).
Вообще-то оно под линухом писалось и работало
0
0 / 0 / 0
Регистрация: 28.04.2009
Сообщений: 118
11.05.2009, 21:16  [ТС]
Короче всем спасибо. Нашел в инете очень крутой пример, прям под мой вопрос)). Очень просто и красиво)) Собственно вот нужный мне кусок(там еще есть описание):
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }
        
        switch(fork())
        {
        case -1:
            perror("fork");
            break;
            
        case 0:
            close(listener);
            while(1)
            {
                bytes_read = recv(sock, buf, 1024, 0);
                if(bytes_read <= 0) break;
                send(sock, buf, bytes_read, 0);
            }
 
            close(sock);
            _exit(0);
            
        default:
            close(sock);
        }
    }
Добавлено через 1 минуту 1 секунду
Только не знаю нормально это или тоже какие-то недочеты есть в этом примере.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.05.2009, 22:31
Ну нормально. На каждое соединение отдельный процесс, который перепинывает данные (в данном случае с ликента на него же самогО)
0
0 / 0 / 0
Регистрация: 14.01.2010
Сообщений: 7
15.01.2010, 12:56
toxxin, а не мог бы ты выложить полностью весь исходник (желательно свой и который скачал)
0
Временно недоступен
 Аватар для #pragma
957 / 228 / 14
Регистрация: 12.04.2009
Сообщений: 926
14.03.2010, 17:45
У меня такой вопрос - а обязательно ли использовать fork()? Я где-то видел статистику сравнения fork и thread,и там вроде потоки создавать намного менее ресурсоёмкое и более быстрое решение. Или в данном случае без fork не обойтись?

Автору - эта ссылка взята с сайта nginx - как раз про 10000 подключений http://www.kegel.com/c10k.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2010, 18:01
С fork'ом получается самая простая реализация: получил клиентское соединение, fork'нулся в отдельный процесс и больше ничего тебя не заботит. Если делать поток, то надо постоянно следить за тем, чтобы не наплодить глобальных переменных (потому как они общие на все потоки). Можно вообще не создавать ни потоков, ни процессов и чтобы всё это жило в одном процессе (как в примере из поста 10). Всё зависит от того, какие ставятся цели и как технически будет выглядеть программа-сервер. Для маленького количества соединений проще всего жить с fork'ом и не париться. Если будет много соединений, но отработка каждого соединения будет быстрая (в моём случае просто делалась сквозная передача данных), то наверное лучше делать всё в одном процессе. Если будет много трудоёмких соединений, то разбивать на потоки, чтобы тормоза одного соединения не сказывались на остальных
2
4 / 4 / 3
Регистрация: 01.07.2009
Сообщений: 127
14.03.2010, 21:06
не вариант для каждого клиента делать fork() + проблема обмениватся данными между процесами - вобщем это не есть хорошо fork не для этих целей .



Цитата Сообщение от Evg Посмотреть сообщение
С fork'ом получается самая простая реализация: получил клиентское соединение, fork'нулся в отдельный процесс и больше ничего тебя не заботит
Это в любом случае самая тупая идея !



Цитата Сообщение от Evg Посмотреть сообщение
Если делать поток, то надо постоянно следить за тем, чтобы не наплодить глобальных переменных (потому как они общие на все потоки).
Понятное дело , следить вобщето за всем нужно .


Автору в помощь

#include <pthread.h> там есть все что тебе нужно .
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
14.03.2010, 22:03
Цитата Сообщение от malik555 Посмотреть сообщение
не вариант для каждого клиента делать fork() + проблема обмениватся данными между процесами - вобщем это не есть хорошо fork не для этих целей .
В простейшем случае (типа того, что я приводил) каждый клиент живёт независимо от других. Никакого IPC не нужно

Цитата Сообщение от malik555 Посмотреть сообщение
Это в любом случае самая тупая идея !
Жизнь такая штука, что зачастую тупые идеи живут долго потому что они тупо надёжны

Цитата Сообщение от malik555 Посмотреть сообщение
Автору в помощь

#include <pthread.h> там есть все что тебе нужно .
Очень развёрнутый ответ и всё так подробно объяснил, что у людей даже вопросов не возникнет
1
60 / 22 / 2
Регистрация: 13.03.2010
Сообщений: 65
15.03.2010, 18:59
Может быть помогут pthread?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.03.2010, 18:59
Помогаю со студенческими работами здесь

Реализация клиент-серверного взаимодействия
Привет. Нужна помощь, необходимо написать клиент-сервер, в котором реализовать следующие возможности: 1) при подключении клиент вводит...

Реализация клиент-серверного приложение
Доброго времени суток, у меня такой вопрос как создать клиент серверное приложение. Пример: допустим калькулятор, я передаю на сервер 2...

Архитектура клиент-серверного приложения
Доброго времени суток. Стоит задача - разработать 4 не больших приложения, из них 3 клиента и 1 сервер. Задача сервера: 1. слушать...

Создание клиент-серверного приложения
Доброго дня. Необходимо написать программу обращения матрицы, она должна быть клиент серверной, то есть, пользователь вводит данные в...

Создание клиент серверного приложения
Доброго времени суток, уважаемые гуру программирования. Надеюсь на Ваш опыт и доброту. Собственно проблема такая: нужно создать СУБД,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru