WSADuplicateSocket ошибка 10024 после обработки сигнала - PullRequest
0 голосов
/ 25 января 2019

Я пишу сервер на C (WIN32), используя модель pre-forking. У меня проблема с запуском сервера в режиме процесса (с использованием процессов), между обработкой сигнала и WSADuplicateSocket функцией

Это мой обработчик сигнала:

BOOL CtrlHandler( DWORD fdwCtrlType ) 
{ 

    //CTRL_C_EVENT
    if(fdwCtrlType == CTRL_BREAK_EVENT)
    {
        printf("break-event\n");
        newConf=1; // 0?no new config:there is new config
        return TRUE;

    }
    else if(fdwCtrlType == CTRL_C_EVENT)
    {
        printf("\nCLOSING SERVER \n");

        return FALSE;

    }
}

Это структура / псевдоним моего сервера: (без проверки ошибок и прочего)

int main(...)
{
    SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
    Conf = readConfig("config.txt"); // a struct
    int N= Conf -> N; //number of workrer
    int mod=Conf->mod; //mod-->  1?thread:process
    createWorkers(); //run N worker and store information about them in arrays
    //
    socket init, listen() etc..
    //
    while(1)
    {
        if(newConf==1)
        {
           //read back config.txt
           //change mod,add new worker, delete worker etc..
        }
        socket=accept(); //wait for client
        //choose a worker to send socket

        if(mod == 0)
        WSADuplicateSocket(clientSocket, pidWorker, &protInfo);

        //sendsocket
        ...     

    }


}

Моя проблема заключается в том, что если я пытаюсь сгенерировать сигнал CTRL + BREAK с клавиатуры, когда основной сервер ожидает подключения клиента, обработчик выполняется правильно, но как только клиент подключается, функция WSADuplicateSocket не удается с:

error code 10024. "Too many open sockets" 

но я запускаю программу (для простоты) только с рабочим процессом. Эта проблема возникает только в том случае, если я генерирую сигнал CTRL + BREAK, пока основное устройство ожидает принятия. Если я запускаю программу без генерации сигналов, сокет правильно продублируется, правильно открывается процессом, который его получил и использовал.

...