Хостинг .exe приложения на ubuntu linux
Создал дроплет на digital ocean, подключился к консоли, установил wine. Запускаю приложение - всё работает. Написал .sh скрипт, чтобы при перезагрузке сервера приложение снова включалось и продолжало работать. Однако приложение выключается само по себе через некоторое время. Это может быть месяц, неделя, а может быть и всего лишь час. Пробовал уже делать изменения в коде - ничего не дало результата. Вот кода из функции main:
int main() {
starting();
add_log("Start new program: " + get_cur_time());//DEBUG
while (1) {
HINTERNET Session = WinHttpOpen(L"HTTP Example/1.0", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
if (!Session) {
add_error("Session error: " + get_cur_time());
}
add_log("New longpoll: " + get_cur_time()); //DEBUG
HINTERNET Connect = connect(L"api.vk.com", Session);
if (!Connect) {
add_error("Connect get long_poll error: " + get_cur_time());
}
HINTERNET Request = req(Connect, (L"/method/groups.getLongPollServer?group_id=" + group_id + L"&v=5.124&access_token=" + token).c_str());
if (!Request) {
add_error("Request get long_poll error: " + get_cur_time());
}
WinHttpSendRequest(Request, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
WinHttpReceiveResponse(Request, NULL);
string buffer1 = down(Request);
//cout << buffer1 << endl;
add_buffer(buffer1 + ": " + get_cur_time()); //BUFFER
nlohmann::json serverjson = nlohmann::json::parse(buffer1);
if (!serverjson["response"].is_null()) {
string key = serverjson["response"]["key"];
string server = serverjson["response"]["server"];
string ts = serverjson["response"]["ts"];
string wh = server.substr(18, server.size() - 1);
server.erase(17, server.size() - 1);
server.erase(0, 8);
wstring s1 = wstring(server.begin(), server.end());
LPCWSTR L7 = s1.c_str();
WinHttpCloseHandle(Request);
WinHttpCloseHandle(Connect);
HINTERNET Connect1 = connect(L7, Session);
if (!Connect1) {
add_error("Connect long_poll error: " + get_cur_time());
}
int i = 0;
while (1) {
string longpoll = "//" + wh + "?act=a_check&key=" + key + "&ts=" + ts + "&wait=0";
wstring s3 = wstring(longpoll.begin(), longpoll.end());
LPCWSTR L8 = s3.c_str();
HINTERNET Request1 = req(Connect1, L8);
if (!Request1) {
add_error("Request long_poll error: " + get_cur_time());
}
WinHttpSendRequest(Request1, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
WinHttpReceiveResponse(Request1, NULL);
string buffer2 = down(Request1);
//cout << buffer2 << endl;
add_buffer(buffer2 + ": " + get_cur_time());//BUFFER
WinHttpCloseHandle(Request1);
nlohmann::json res = nlohmann::json::parse(buffer2);
if (!res["updates"].is_null()) {
int n = res["updates"].size();
while (i < n) {
if (res["updates"][i]["type"] == "message_new") {
string text = res["updates"][i]["object"]["message"]["text"];
string id = to_string(res["updates"][i]["object"]["message"]["from_id"]);
string peerid = to_string(res["updates"][i]["object"]["message"]["peer_id"]);
string msgid = to_string(res["updates"][i]["object"]["message"]["conversation_message_id"]);
string kout = "Id = " + id + " " + "Peerid = " + peerid + " " + "Text = " + text;
add_log(kout + ": " + get_cur_time());//DEBUG
//cout << kout << endl;
analyze(id, str_wstr(peerid), str_wstr(msgid), text, Session);
}
i++;
}
}
else {
break;
}
}
WinHttpCloseHandle(Connect1);
}
WinHttpCloseHandle(Session);
}
return 0;
}
Ответы (2 шт):
У Вас в коде очень странная обработка ошибок. Посмотрите на такое
HINTERNET Connect1 = connect(L7, Session);
if (!Connect1) {
add_error("Connect long_poll error: " + get_cur_time());
}
то есть, произошла ошибка, ее вывели куда то и поехали дальше выполнять код. Но вот функции дальше не готовы, что им прилетит неверный дескриптор. И что будет дальше - одному msdn известно.
Что делать? в случае подобных ошибок нужно подумать о правильной обработке. Возможно, в первом случае будет достаточно сделать continue;, что бы начать цикл снова, во внутреннем цикле нужно будет подумать, возможно нужно будет закрыть открытые дескрипторы и подобное.
А вообще я бы переписал это на go или python, и не нужен будет wine, но это дело вкуса.
Насколько я понял, проблема была в этих кусках кода: nlohmann::json res = nlohmann::json::parse(buffer2); Жсон парсился, но парсил он пустую строку, поэтому выбивало исключение, поэтому программа вылетала. Стоит добавить лишь это: if (nlohmann::json::accept(buffer2)). Я сделал обработку ошибок хендлов, но файл с отчётом об этих ошибках на сервере у меня так и не создался, значит такие ошибки бывают очень редко. Самое интересное, что в исходном варианте программа могла работать месяц, а потом падать.