while(true)中的C ++程序意外退出

时间:2019-05-18 15:35:43

标签: c# c++ sockets tcp while-loop

我有两个程序,一个服务器(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;
}

运行此命令时,客户端程序在命令执行后结束并发送回服务器。为什么程序退出?它处于一段时间(true)循环中,并且服务器仍处于启动状态,因此它不应该回到循环的顶部吗?我非常确定它与exec()命令有关,因为当我删除它时,程序并没有结束,而是像预期的那样返回到循环的顶部。 谢谢。

0 个答案:

没有答案