Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/35: Рейтинг темы: голосов - 35, средняя оценка - 4.57
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
#1

Программа клиент-сервер

11.02.2013, 16:44. Просмотров 6327. Ответов 50
Метки нет (Все метки)

Здраствуйте уважаемые программисты,
У меня к вам одна просьба,помогите пожалуйста написать программу с одним сервером и множеством клиентов.Суть программы такова : Один из сотни клиентов нажимает кнопку и она отсылает на сервер данные,загорается красная,желтая,зеленая или синяя лампочка в соответствии с нажатой кнопкой у клиента.Также в списке клиентов на сервере регистрируется время нажатия.
Пожалуйста помогите написать такую на первый взгляд не сложную программу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2013, 16:44
Ответы с готовыми решениями:

Простейшая программа клиент-сервер
Доброго времени суток. Появилась необходимость в написании примитивного...

программа "Сервер - клиент". В чем тут ошибка?
Хочу реализовать подключение клиента к серверу...когда клиента подключиться к...

Клиент-Серверное приложение. Как сделать, чтобы сервер сам отправлял сообщения на клиент
Добрый день всем. Проблема заключается в следующем: Есть клиент-серверное...

Tcp ip клиент-сервер C++ сервер выводит мусор
server # include <sys/types.h> # include <iostream> # include <winsock2.h>...

Клиент/сервер: клиент посылает серверу слово; определить, является ли это слово палиндромом
Осуществить взаимодействие клиента и сервера на основе протокола TCP/IP....

50
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
12.02.2013, 10:49 #2
из далека: на чем?
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
12.02.2013, 12:02  [ТС] #3
Хотелось бы на С++ ...
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
12.02.2013, 13:08 #4
чуть ближе: IDE? ОС? библиотеки?
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
12.02.2013, 21:23  [ТС] #5
Цитата Сообщение от vxg Посмотреть сообщение
чуть ближе: IDE? ОС? библиотеки?
RAD C++ Builder / Win XP,Win7 / насчет библиотек не знаю ((
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
12.02.2013, 22:16 #6
для примера
консольный клиент
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//------------------------------------------------------------------------------
#include <winsock>
#include <iostream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    std::string ip;
    int port;
 
    std::cout << "ip>";
    std::cin >> ip;
    std::cout << "port>";
    std::cin >> port;
    std::cin.ignore();
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101)
    {
        std::cout << "WSAStartup error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        std::cout << "socket error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
 
    std::string message;
    while (true)
    {
        std::cout << ">";
        std::getline(std::cin, message);
        if (message == "exit") break;
        if
        (
            sendto
            (
                s,
                message.c_str(), message.length() + 1,
                0,
                (SOCKADDR *)&sa, sizeof(sa)
            ) == SOCKET_ERROR
        )
        {
            std::cout << "sendto error" << std::endl;
            break;
        }
    }
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
консольный сервер
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//------------------------------------------------------------------------------
#include <winsock>
#include <conio.h>
#include <iostream>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    std::string ip;
    int port;
 
    std::cout << "ip>";
    std::cin >> ip;
    std::cout << "port>";
    std::cin >> port;
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101)
    {
        std::cout << "WSAStartup error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (s == INVALID_SOCKET)
    {
        std::cout << "socket error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(port);
    sa.sin_addr.S_un.S_addr = inet_addr(ip.c_str());
 
    if (bind(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR)
    {
        std::cout << "bind error" << std::endl;
        system("pause");
        return -1;
    }
 
    SOCKADDR_IN nsa;
    int sizeof_nsa = sizeof(nsa);
 
    char buffer[1024];
    int buffer_size = sizeof(buffer);
    while (!kbhit())
    {
        if
        (
            recvfrom
            (
                s,
                buffer, buffer_size,
                0,
                (SOCKADDR *)&nsa, &sizeof_nsa
            ) == SOCKET_ERROR
        )
        {
            std::cout << "recvfrom error" << std::endl;
            break;
        }
        std::cout << inet_ntoa(nsa.sin_addr) << ">" << buffer << std::endl;
    }
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
все вместе являет собой подобие аськи
в вашем случае - обработать напильником - вместо сообщения передавать порядковый номер клавиши и подсвечивать его на сервере вместе с временем прихода сообщения. все что до цикла - в конструктор формы, все что в цикле - в таймер, все что за циклом - в деструктор формы
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
12.02.2013, 23:10  [ТС] #7
Очень интересно ... Завтра же попробую. Давайте я вам расскажу о своей задумке. Я хочу сделать карту нашего города с отмеченными на ней объектами взятыми нами на сервисное обслуживание.Установить на клиентские компьютеры программки которые будут передавать сигнал о необходимости сервисного обслуживания,и тип срочности так скажем а так же большая кнопка при нажатии на которую к нам в офис придет сигнал что мол сервис окончен,"всем спасибо" )) Как только клиент нажмет на какую либо кнопку в программе установленной на кассовом компьютере сразу же загорится индикатор (лампочка) на карте города соответствующий нажатой кнопке у клиента. Немного сумбурно написал ...

Добавлено через 12 минут
Я был бы вам очень признателен если бы мы вместе как нибудь создали такую программу.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
13.02.2013, 09:21 #8
..5 с попробую набросать..
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
13.02.2013, 09:25  [ТС] #9
Цитата Сообщение от vxg Посмотреть сообщение
..5 с попробую набросать..
Большое спасибо,Вы меня очень выручите этим ))
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
13.02.2013, 13:12 #10
как то так. по хорошему сервер должен отвечать клиенту что заявка получена. сейчас этого нет. + возможно следует передавать комментарий к заявке. сейчас этого нет. + можно до бесконечности украшать сервер: таскание карты мышкой, масштабирование с привязкой к курсору - сейчас этого тоже нет.
3
Вложения
Тип файла: rar maintenance_assistant_server.rar (997.7 Кб, 132 просмотров)
Тип файла: rar maintenance_assistant_client.rar (317.3 Кб, 112 просмотров)
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
13.02.2013, 22:54  [ТС] #11
Цитата Сообщение от vxg Посмотреть сообщение
как то так. по хорошему сервер должен отвечать клиенту что заявка получена. сейчас этого нет. + возможно следует передавать комментарий к заявке. сейчас этого нет. + можно до бесконечности украшать сервер: таскание карты мышкой, масштабирование с привязкой к курсору - сейчас этого тоже нет.
Классно!!! )) как этот клиент и сервер могут связаться меж собой по интернету?Думаю осуществлять это посредством Port Forwarding'a клиентской части программы на модеме.А также необходимо как то указать серверу какие он должен прослушивать порты и айпишки ... И насчет расположения "точек"-объектов на карте города ...
Можно ли будет их перетаскивать мышкой,расставляя их в нужном порядке?
Как указать серверу какие айпи как назвать на карте?
Сегодня пришла в голову одна мысль ... к примеру клиент из бутика Gucci нажимает кнопку с кодом RED,сервер прослушивая все айпи и порты,обнаруживает трафик данных из того магазина и приняв их заменяет цвет точки на красный и рядом с названием объекта через тире начинает отсчет времени в обратном порядке (24 часа) желательно вплоть до секунд.Как только сервисное обслуживание закончилось клиент нажимает кнопку с кодом GREEN и сервер приняв команду меняет цвет определенной точки на зеленый и обнулив счетчик убирает его из надписи объекта.
0
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
13.02.2013, 23:10  [ТС] #12
Вот к примеру ...
0
Миниатюры
Программа клиент-сервер  
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
14.02.2013, 08:58 #13
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
как этот клиент и сервер могут связаться меж собой по интернету
в идеале - клиенту и серверу (ну или хотя бы серверу) нужен собственный IP. если получить IP не вариант - поднять VPN или поставить программу хамачи которая создаст виртуальную локальную сеть между компьютерами.
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
А также необходимо как то указать серверу какие он должен прослушивать порты и айпишки
сейчас:
- в файле конфигурации сервера указывается: путь к файлу карты, IP сетевого адаптера на который будут приходить сообщения от клиентов (0 - если сообщения могут прийти на любой адаптер), порт. рядом с картой должен быть файл с описанием объектов называющийся так же как и карта, имеющий расширение TXT и содержащий в каждой строке через пробел: идентификатор клиента, координаты X Y, адрес
- в файле конфигурации клиента указывается: идентификатор клиента, IP сервера, порт
====
таким образом сервер слушает порт и по содержимому пакета идентифицирует клиента
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
Можно ли будет их перетаскивать мышкой,расставляя их в нужном порядке
конечно можно. в этом мире возможно все. только сейчас этого не реализовано.
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
Как указать серверу какие айпи как назвать на карте
см. файл с описанием объектов и текст выше относительно файлов конфигурации
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
и рядом с названием объекта через тире начинает отсчет времени в обратном порядке (24 часа) желательно вплоть до секунд.Как только сервисное обслуживание закончилось клиент нажимает кнопку с кодом GREEN и сервер приняв команду меняет цвет определенной точки на зеленый и обнулив счетчик убирает его из надписи объекта
конечно можно. в этом мире возможно все. только сейчас этого не реализовано.

Добавлено через 2 минуты
...отдельно хотелось бы обратить ваше внимание на доверчивость сервера в текущем варианте реализации: он примет на веру любой правильный пакет. по хорошему необходимы процедуры авторизации.
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
14.02.2013, 11:31  [ТС] #14
То есть сейчас практически этот сервер и клиент почти готовы )) Я могу взять внешний статический IP и использовать его на сервере ...
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
14.02.2013, 11:42 #15
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
То есть сейчас практически этот сервер и клиент почти готовы
в том виде в котором они есть - да. при необходимости - дорабатываются напильником.
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
Я могу взять внешний статический IP и использовать его на сервере
да, в существующей реализации достаточно что бы сервер имел свой IP.
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
15.02.2013, 10:05  [ТС] #16
Большое спасибо ))) я думаю сам доведу его до ума ))

Добавлено через 13 часов 22 минуты
Цитата Сообщение от vxg Посмотреть сообщение
в том виде в котором они есть - да. при необходимости - дорабатываются напильником.

да, в существующей реализации достаточно что бы сервер имел свой IP.
Как можно сделать чтобы в клиенте и в сервере можно было прописать IP сервера,ID клиента,Port по которому она будет соединяться с сервером,так чтобы не лезть в конфиг файл а оформить в виде отдельного окошка?

Добавлено через 27 минут
Да и еще совсем забыл как скомпилировать автономное приложение? )) сорри за глупый вопрос ...
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
15.02.2013, 14:25 #17
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
Как можно сделать чтобы в клиенте и в сервере можно было прописать IP сервера,ID клиента,Port по которому она будет соединяться с сервером,так чтобы не лезть в конфиг файл а оформить в виде отдельного окошка?
создать форму в которую запхать параметры. как вариант - подгружать их при старте из конфига а перед выходом - сохранять
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
Да и еще совсем забыл как скомпилировать автономное приложение?
а чем оно вам не автономное? снять галочки packages/build with runtime packages и linker/use dynamic rtl?
1
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
15.02.2013, 19:27  [ТС] #18
Цитата Сообщение от vxg Посмотреть сообщение
создать форму в которую запхать параметры. как вариант - подгружать их при старте из конфига а перед выходом - сохранять

а чем оно вам не автономное? снять галочки packages/build with runtime packages и linker/use dynamic rtl?
Просто если я начну дополнять его и улучшать ту основу которую вы мне дали то соответственно нужно будет скомпилировать автономное,как сейчас.
0
vxg
Модератор
3247 / 2048 / 322
Регистрация: 13.01.2012
Сообщений: 7,927
15.02.2013, 22:01 #19
Цитата Сообщение от Саид Гафаров Посмотреть сообщение
как сейчас
снова не понял. оно сейчас не автономное? или станет после изменений? если станет то почему? если сейчас то где?
0
Саид Гафаров
1 / 1 / 0
Регистрация: 11.02.2013
Сообщений: 49
15.02.2013, 22:25  [ТС] #20
Цитата Сообщение от vxg Посмотреть сообщение
снова не понял. оно сейчас не автономное? или станет после изменений? если станет то почему? если сейчас то где?
Оно сейчас автономное,хотелось бы чтобы и после моих изменений оно оставалось таким же )))

Кстати,здесь на форуме я нашел как сохранять и загружать настройки программы посредством ini файла.Могу ли я заменить файл cfg на ini?
0
15.02.2013, 22:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2013, 22:25

Клиент-сервер
Как написать программу клиент-сервер, самую простую, например что бы клиент мог...

Клиент-сервер
Добрый вечер. Моя цель - реализовать клиент-серверную программу, использующую...

Клиент - Сервер
У меня вот тоже такой вопрос по многопоточности... Только начала с этим...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru