powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отправить задание c++ серверу
25 сообщений из 98, страница 1 из 4
Отправить задание c++ серверу
    #40032025
ro25man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
Решил поизучать серверные приложений на c++ и написать простенький сервер, выполняющий запросы клиента. Есть клиент, с которого я отправляю запрос, чтобы выполнить какую-либо операцию на сервере. Пусть это будет функция, возвращающая текущее время getTime(). Как заставить сервер выполнить эту функцию?
Единственное предположение - это передавать какой-то признак (текст, число), который будет привязан к функции getTime(). На сервере добавить переменную и выполнять её обработку через if или switch. Это выглядит примерно так:
if (param == "getTime")
getTime();
и т.д. для каждой функции сервера. То есть если на сервере будет 1000 таких функций, то для каждой из них мне нужно будет делать ветку else if? Аналогично при использовании оператора switch.
Есть другие способы для выполнения таких запросов или это единственный?
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032046
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ro25manЕсть другие способы для выполнения таких запросов или это единственный?

Единственный.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032059
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В вопросе есть два вопроса.

Первое - это протокол. Как передать по сети. Да хоть так.

Код: plaintext
1.
wget http://ro25man.com/server?argument=getTime



Второе - это реализация. Можно switch. Можно if. Можно еще много чего придумать
но ты начни хотя-бы с клиент-сервера на сокетах.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032477
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ro25man
Есть другие способы для выполнения таких запросов или это единственный?

От используемых технологий зависит.
Например, реализуя сервер как Web сервис/службу, ты напрямую создаешь на сервере реализацию нужных методов. А клиент обращается прямо к нужному методу. Далее волшебным образом запрос клиента преобразуется в запрос низкого уровня, поток данных передается на сервер, где-то невидимо от тебя выполняется цепочка else-if, и вызывается нужны тебе метод, результат возвращается клиенту. Подобных технологий и библиотек - масса.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032507
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гугли "c++ client-server"
mayton
Да хоть так.

Код: plaintext
1.
wget http://ro25man.com/server?argument=getTime


это целый HTTP-сервер нужен )
а у него просто сокеты
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032513
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ro25man

Единственное предположение - это передавать какой-то признак (текст, число), который будет привязан к функции getTime(). На сервере добавить переменную и выполнять её обработку через if или switch. Это выглядит примерно так:
if (param == "getTime")
getTime();
и т.д. для каждой функции сервера. То есть если на сервере будет 1000 таких функций, то для каждой из них мне нужно будет делать ветку else if? Аналогично при использовании оператора switch.
Есть другие способы для выполнения таких запросов или это единственный?


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

При этом конечно IF/SWITCH там в коде в явном виде может и не быть, но суть действий всё равно такая: по какому-то типу запроса будут вызываться на выполнение какие-то действия. И от этого IF/SWITCH конечно же никуда не уйти.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032528
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78
гугли "c++ client-server"
mayton
Да хоть так.

Код: plaintext
1.
wget http://ro25man.com/server?argument=getTime


это целый HTTP-сервер нужен )
а у него просто сокеты

А расскажи какая разница между HTTP сервером и сокетами? Или протоколом telnet. Тоесть насколько она велика.

И как вообще можно построить протокол на сокетах?
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032539
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
+1
Слово просто "сервер" не существует. Без указания протокола/архитектуры.
Есть сокет сервер, веб сервер, аппСервер, фтпСервер.....
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032593
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА расскажи какая разница между HTTP сервером и сокетами? Или протоколом telnet. Тоесть
насколько она велика.

Размером в сумму всех RFC, расписывающих HTTP заголовки и соответствющие им форматы
данных. Несколько мегабайт нужного чтения наберётся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032599
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

maytonА расскажи какая разница между HTTP сервером и сокетами? Или протоколом telnet. Тоесть
насколько она велика.

Размером в сумму всех RFC, расписывающих HTTP заголовки и соответствющие им форматы
данных. Несколько мегабайт нужного чтения наберётся.

Автор - пытается построить свой протокол. Я предполагаю что поверх сокетов. Хотел предложить ему
сначала telnet как клиента. И спецификацию команд наподобие упрощенного http. Типа POST/GET.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032606
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ спецификацию команд наподобие упрощенного http. Типа POST/GET.

Ты же знаешь, что парсинг тестового потока в С/С++ - занятие не для слабонервных...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032608
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда... согласен.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032615
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сказал, что разбор любого потока требует аккуратности, сосредоточенности и изобретательности.
Вне зависимости от языка
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032686
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
tip78
гугли "c++ client-server"
пропущено...

это целый HTTP-сервер нужен )
а у него просто сокеты

А расскажи какая разница между HTTP сервером и сокетами? Или протоколом telnet. Тоесть насколько она велика.

И как вообще можно построить протокол на сокетах?

парсинг форм в fCGI - это отдельная, долгая, грустная, вопиющая песня.
обработка заголовков и роутинг - ещё пара очень грустных песен.
Простенький сервер на сокетах же просто принимает сигнал, не сильно сложнее ping-pong, и реагирует на него списком if-ов.

Задачу с протоколом не видел, человек просто хотел:
ro25man
написать простенький сервер, выполняющий запросы клиента.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032740
ro25man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В ответах речь пошла и про http сервер, и про новый протокол. Поясню, как именно я предполагал реализовать сервер.
Использую для работы с сетью WinAPI. Может быть не самое лучшее средство, но для начала, на мой взгляд, вполне подходит. С помощью send() я отправляю запрос от клиента. Так как мне нужно вызвать функцию getTime(), то в буфер записал строку "getTime". На стороне сервера принимаю с помощью recv() данные, читаю буфер. Затем пробегаю по условиям и ищу нужную мне ветку
if (param == "getTime")
getTime();

Далее возвращаю результат клиенту. Собственно мой вопрос и заключался, единственное ли это решение для извлечения данных от сервера или есть другие варианты
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032820
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ro25man,
Вы новый протокол пишите или http server?
Если только протокол то дайте код сервера.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032836
ro25man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PetroNotC Sharp,

код сервера простой. Взял на просторах интернета как есть, ничего пока не менял. В код добавил комментарий, который начинается фразой "здесь добавить мой код" . Вот там и будет выполнена реализация того, что я хочу получить от сервера, мои овердофига функций, классов и т.д.
Код: plaintext
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.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
int main()
{
    WSADATA wsaData;
    int iResult;

    SOCKET ListenSocket = INVALID_SOCKET;
    SOCKET ClientSocket = INVALID_SOCKET;

    struct addrinfo* result = NULL;
    struct addrinfo hints;

    int iSendResult;
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen = DEFAULT_BUFLEN;

    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) 
    {
        printf("WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;

    // Resolve the server address and port
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed with error: %d\n", iResult);
        WSACleanup();
        return 1;
    }

    // Create a SOCKET for connecting to server
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if (ListenSocket == INVALID_SOCKET) 
    {
        printf("socket failed with error: %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }

    // Setup the TCP listening socket
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if (iResult == SOCKET_ERROR)
    {
        printf("bind failed with error: %d\n", WSAGetLastError());
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    freeaddrinfo(result);

    iResult = listen(ListenSocket, SOMAXCONN);
    if (iResult == SOCKET_ERROR) 
    {
        printf("listen failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET)
    {
        printf("accept failed with error: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }

    // No longer need server socket
    closesocket(ListenSocket);

    // Receive until the peer shuts down the connection
    do {

        iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);
        if (iResult > 0)        
        {
            printf("Bytes received: %d\n", iResult);

            /* здесь добавить мой код
            if (recvbuf== "anyText")
                anyFunc();
            else if ... и т.д.
            */

            // Echo the buffer back to the sender
            iSendResult = send(ClientSocket, recvbuf, iResult, 0);
            if (iSendResult == SOCKET_ERROR)
            {
                printf("send failed with error: %d\n", WSAGetLastError());
                closesocket(ClientSocket);
                WSACleanup();
                return 1;
            }
            printf("Bytes sent: %d\n", iSendResult);
        }
        else if (iResult == 0)
        {
            printf("Connection closing...\n");
        }
        else 
        {
            printf("recv failed with error: %d\n", WSAGetLastError());
            closesocket(ClientSocket);
            WSACleanup();
            return 1;
        }

    } while (iResult > 0);

    // shutdown the connection since we're done
    iResult = shutdown(ClientSocket, SD_SEND);
    if (iResult == SOCKET_ERROR) 
    {
        printf("shutdown failed with error: %d\n", WSAGetLastError());
        closesocket(ClientSocket);
        WSACleanup();
        return 1;
    }

    // cleanup
    closesocket(ClientSocket);
    WSACleanup();

    return 0;
}
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032842
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ro25manВ код добавил комментарий, который начинается фразой *"здесь добавить мой код"*. Вот там и
будет выполнена реализация того, что я хочу получить от сервера, мои овердофига функций,
классов и т.д.

И вот там уже твоя первая ошибка. TCP это поток, recv() способен рубить его на
произвольные части. За раз ты можешь получить только часть того буфера, что отправлял,
или, наоборот, две отправки будут слеплены вместе. Поэтому-то выше и говорилось, что
парсинг потока - занятие нетривиальное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032849
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут по идее мультипоточка нужна.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40032877
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ro25man,

Я бы делал отдельный бинарник http server и отдельный твой код.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40033018
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Единственный.

А табличный метод отменили уже что-ли?

Делаем табличку в памяти (массив структур) состоящую из отсортированных идентификаторов запроса и указателя на функцию, этот запрос обрабатывающую. Тупым бинарным поиском ищем принятый идентификатор в таблице. Если не найден - ошибка. Если найден - вызываем функцию, обрабатывающий запрос с таким идентификатором передавая ей все остальные параметры запроса.
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40033020
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и чем это лучше if/switch ?
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40033022
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы даже спросил "чем это отличается от if"...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40033024
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ptr128
Dimitry Sibiryakov

Единственный.

А табличный метод отменили уже что-ли?

Делаем табличку в памяти (массив структур) состоящую из отсортированных идентификаторов запроса и указателя на функцию, этот запрос обрабатывающую. Тупым бинарным поиском ищем принятый идентификатор в таблице. Если не найден - ошибка. Если найден - вызываем функцию, обрабатывающий запрос с таким идентификатором передавая ей все остальные параметры запроса.

Делаем табличку в памяти, состояющую из указателей на реализации методов.
В запросе передаем индекс метода, вместо его имени.
Сервер обращается к методу по индексу. Далее метод выполняет специфичный для него код (например, выбирает из тела запроса значения входных параметров метода и т.п.).
...
Рейтинг: 0 / 0
Отправить задание c++ серверу
    #40033025
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, сервер обращается к реализации метода за один шаг, как к элементу массива.
...
Рейтинг: 0 / 0
25 сообщений из 98, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / Отправить задание c++ серверу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]