У меня есть две программы, сервер (на 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 (), потому что когда я ее удаляю, программа не завершается, а вместо этого возвращается к началу цикла, как и положено.
Спасибо.