LINUX.ORG.RU

c++ Запуск игрового сервера через сокет сервер

 


0

2

Здравствуйте, в c++ я относительно недавно. Не могу разобраться и в google ничего не могу найти да и толком не знаю, что искать...

Проблема такая я написал на c++ сокет сервер на который с сайта приходит команда для запуска игрового сервера.

Сам игровой сервер состоит из нескольких сервисов *Авторизация *лог сервис *Игровая база и т.д

Суть в том что когда я пытаюсь запустить через system(«/home/server/gamedb config.conf») или popen() мой сокет начинает читать консоль и зависает, ждет пока остановят игровой сервер..

Указания & в конце не помогает...

Помогите пожалуйста разобраться и решить данную проблему.

На первый взгляд, тебе нужен fork+exec.

Однако абзаца ниже я не понял

Суть в том что когда я пытаюсь запустить через system(«/home/server/gamedb config.conf») или popen() мой сокет начинает читать консоль и зависает, ждет пока остановят игровой сервер..

KennyMinigun ★★★★★
()

Он не зависает, а ожидает окончания выполнения. Лорчую fork+exec

XMs ★★★★★
()

Помимо предложенных решений, ты можешь демонизировать сам gamedb если в где-нибудь в начале кода добавишь fork + setsid.

Aswed ★★★★★
()

Форки и треды наше все.

Как уже выше скзаали, ничего не висит, а ждет завершения процесса.

И не пользуйся system - ты так никогда не узнаешь чем завершился процесс (код возврата) и не сможешь получить его вывод в stdout.

А еще я сталкивался с тем что system(«pause») не совсем ождаемо вел себя в gnome-terminal на 12.04 (или на 10.10, точно не помню) убунте «паузя» все вкладки терминала (хотя это баг самого терминала).

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 3)
Ответ на: комментарий от RiseOfDeath

И не пользуйся system - ты так никогда не узнаешь чем завершился процесс (код возврата)

man system:

RETURN VALUE
...
*  If all system calls succeed, then the return value is the termination status
   of the child shell used to execute command.  (The termination status of a
   shell is the termination status of the last command it executes.)

In the last two cases, the return value is a «wait status» that can be examined
using the macros described in waitpid(2).  (i.e., WIFEXITED(), WEXITSTATUS(),
and so on).

xaizek ★★★★★
()
Ответ на: комментарий от Aswed

Проще тогда в скрипт обернуть вызов сервера не?

pon4ik ★★★★★
()

Освободить порт

Решил проблему с запуском,но теперь другая проблема те 10 сервисов игрового сервера весят на порте сокета, если я запускаю игровой сервер и убиваю сокет порт все-равно занят, по карте процессов смотрю, и это раздельные процессы а по сетям все сидят на порту 8888 в состояние close-wite

Пример:

tcp CLOSE-WAIT 1 0 127.0.0.1:8888 127.0.0.1:55914 users:((«gs»,pid=9063,fd=7),(«glinkd»,pid=9062,fd=7),(«gdeliveryd »,pid=9050,fd=7),(«gfactiond»,pid=9040,fd=7),(«gacd»,pid=9037,fd=7),(«java»,pid= 9032,fd=7),(«gamedbd»,pid=9031,fd=7),(«uniquenamed»,pid=9020,fd=7),(«logservice» ,pid=9015,fd=7))

jonykook
() автор топика
Ответ на: Освободить порт от jonykook

Запускаю вот так

        int pidStart = fork();
            if (pidStart < 0) {
                sendMessage = «Fork failed»;
            } else if (pidStart == 0) {
                setsid ();
                pidStart = fork();
                if (pidStart < 0) {
                    sendMessage = «Fork failed»;
                } else if (pidStart == 0) {
                    umask(0);
                    chdir(«/»);
                    close(STDIN_FILENO);
                    close(STDOUT_FILENO);
                    close(STDERR_FILENO);
//command[1].c_str() - cd /home/gamed; ./gs gs01 > /home/logs/gs01.log 
                    exec(command[1].c_str());
                    exit(1);
                }
                exit(0);
                sendMessage = «start »;
            }
            wait(0);
jonykook
() автор топика
Ответ на: комментарий от Deleted

Так же

Вот, что получилось.. но порт по прежнему занят...

           
            int pidStart = fork();
            if (pidStart < 0) {
                sendMessage = «Fork failed»;
            } else if (pidStart == 0) {
                sendMessage = «start 1»;
                setsid();
                umask(0);
                chdir(«/»);
                pthread_t tid[startI]; /* идентификатор потока */
                cmd.command = command[1];
                pthread_create(&tid[startI], NULL, potok, &cmd);
                pthread_detach(pthread_self());

            }
            startI = startI + 1;

jonykook
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.