Хостинг .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 шт):

Автор решения: KoVadim

У Вас в коде очень странная обработка ошибок. Посмотрите на такое

HINTERNET Connect1 = connect(L7, Session);
if (!Connect1) {
    add_error("Connect long_poll error: " + get_cur_time());
}

то есть, произошла ошибка, ее вывели куда то и поехали дальше выполнять код. Но вот функции дальше не готовы, что им прилетит неверный дескриптор. И что будет дальше - одному msdn известно.

Что делать? в случае подобных ошибок нужно подумать о правильной обработке. Возможно, в первом случае будет достаточно сделать continue;, что бы начать цикл снова, во внутреннем цикле нужно будет подумать, возможно нужно будет закрыть открытые дескрипторы и подобное.

А вообще я бы переписал это на go или python, и не нужен будет wine, но это дело вкуса.

→ Ссылка
Автор решения: Petuha

Насколько я понял, проблема была в этих кусках кода: nlohmann::json res = nlohmann::json::parse(buffer2); Жсон парсился, но парсил он пустую строку, поэтому выбивало исключение, поэтому программа вылетала. Стоит добавить лишь это: if (nlohmann::json::accept(buffer2)). Я сделал обработку ошибок хендлов, но файл с отчётом об этих ошибках на сервере у меня так и не создался, значит такие ошибки бывают очень редко. Самое интересное, что в исходном варианте программа могла работать месяц, а потом падать.

→ Ссылка