Как вернуть TCP, получить данные и отправить данные обратного вызова? - PullRequest
0 голосов
/ 08 марта 2020

Как я могу отправить команду и обработать команду на С ++ для слушателя.

Я хочу что-то вроде приведенного ниже кода ....

switch (args[i][1])
                {
                    case 'command1':  
                        command1function();
                        break;
                    case 'command2':
                        command2function();
                        break;
                    case 'command3':
                        command3function();
                        break;
                    default:
                        return 0;
                }

TCP Listener c ++ (см. Пожалуйста ссылка на GITHUB - это не мой проект, но я уже несколько часов пытаюсь, без всякой удачи, любая помощь будет принята с благодарностью) https://github.com/GreatBullet/Listener_Project/

void Class_tcp_Listener::Run()
{
    char buf[MAX_BUFFER_SIZE];
    while (true) 
    {
        //create a listening socket
        SOCKET listening = CreateSocket();
        if (listening == INVALID_SOCKET)
        {
            break;
        }
        SOCKET client = WaitForConnection(listening);
        if (client != INVALID_SOCKET)
        {
            closesocket(listening);
            int bytesReceived = 0;
            do
            {
                ZeroMemory(buf, MAX_BUFFER_SIZE);
                bytesReceived = recv(client, buf, MAX_BUFFER_SIZE, 0);
                if (bytesReceived > 0) 
                {
                    if (MessageReceived != NULL)
                    {
                        MessageReceived(this, client, std::string(buf, 0, bytesReceived));
                        std::cout << std::string(buf, 0, bytesReceived) << '\n';
                    }
                }
            } while (bytesReceived > 0);
            closesocket(client);
        }
    }
}

1 Ответ

0 голосов
/ 08 марта 2020

Вы можете использовать std::unordered_map для хранения функциональных оболочек:

#include <iostream>
#include <string>
#include <unordered_map>
#include <functional>

void command3() {
    std::cout << "command3\n";
}

int main() {
    std::unordered_map<std::string, std::function<void(void)>> commands;
    commands["command1"] = [] {std::cout << "command1\n"; };
    commands["command2"] = [] {std::cout << "command2\n"; };
    commands["command3"] = command3;

    std::string args = "command3";
    auto it = commands.find(args);
    if (it != commands.end()) {
        it->second(); 
    } else {
        std::cerr << "Invalid command: " << args << "\n";
    }
}

PS Возможно, в будущих стандартах будет добавлено соответствие шаблону .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...