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