我有两个程序,一个服务器(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()命令有关,因为当我删除它时,程序并没有结束,而是像预期的那样返回到循环的顶部。 谢谢。