Программа на C ++ в то время как (true) неожиданно завершает работу - PullRequest
0 голосов
/ 18 мая 2019

У меня есть две программы, сервер (на C #) и клиент (C ++). Сервер отправляет команду (команду cmd), которую выполняет клиент. Затем клиент отправляет вывод команды обратно на сервер. Я поместил комментарий, который показывает, где программа останавливается в коде ниже.

Клиент:

string cmd;
while (true) {
    cout << "Waiting for command" << endl;
    cmd = recvMsg();
    cout << "Got command" << endl;
    cout << cmd << endl;
    string cmdResult = exec(cmd.c_str());
    cout << "Executed command" << endl;
    //cout << "Got output from exec: " + cmdResult << endl;
    char sendBuf[DEFAULT_BUFLEN];
    strcpy(sendBuf, cmdResult.c_str());
    cout << "Converted into sendBuf\n";
    int result = send(s, sendBuf, strlen(sendBuf), 0);
    cout << "Sent command\n";
    // Program stops here, shouldn't it continue?
}

Сервер (написанный на C #):

string cmdToSend = "";

if (cmdInput.Text != String.Empty)
{
    cmdToSend = cmdInput.Text;
    byte[] sendBuf = System.Text.Encoding.ASCII.GetBytes(cmdToSend);
    conn.Send(sendBuf);
    byte[] recvBuf = new byte[1024];
    int bytesRecv = conn.Receive(recvBuf);
    string reply = System.Text.Encoding.ASCII.GetString(recvBuf);
    Console.WriteLine("reply: " + reply);
    cmdOutput.Text = reply;

}

Примечание: cmdInput и cmdOuput являются текстовыми полями WPF

Команда exec, вызываемая на клиенте, выглядит примерно так:

string exec(const char* cmd) {
    FILE* fp = _popen(cmd, "r");
    string result;
    if (fp) {
        std::vector<char> buffer(4096);
        std::size_t n = fread(buffer.data(), 1, buffer.size(), fp);
        if (n && n < buffer.size()) {
            buffer.data()[n] = 0;
            std::cout << buffer.data() << '\n';
            result = buffer.data();
        }
        _pclose(fp);
    }
    return result;
}

Когда я запускаю это, клиентская программа заканчивается после того, как команда выполнена и отправлена ​​обратно на сервер. Почему программа закрывается? Он находится в цикле while (true), а сервер все еще в рабочем состоянии, поэтому не следует ли вернуться к началу цикла? Я почти уверен, что это как-то связано с командой exec (), потому что когда я ее удаляю, программа не завершается, а вместо этого возвращается к началу цикла, как и положено. Спасибо.

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