Курсовая работа: Розробка програмного забезпечення системи збору даних про хід та параметри технологічного процесу
{
if ((time(NULL) - sockInfo[i].time)>60)
{
DeleteSockInfo(i , 1);
}
}
}//for
LeaveCriticalSection (&cs);
}//while
return 0;
Треба зазначити, що сокети клієнтів можуть закриватися при таймауті, при закритті серверу. Тому є спеціальний масив char bAlowCloseClient[MAX_CLIENT] , який указує потоку клієнта, що не потрібно видаляти сокет, бо це буде зроблено іншим модулем програми. В іншому разі, якщо виникла звичайна помилка, то потік клієнта самостійно закриє цей сокет.
Модуль обробки клієнта приймає запити та відповідно отриманих даних виконує дії. Сервер приймає запит req у якому знаходиться тип запиту, ідентифікатор клієнту та довина запросу.
nLeft = sizeof(request);
idx = 0;
while(nLeft > 0)
{
ret = recv(sockInfo[nClient].sClient, ((char *) &req)+idx, nLeft, 0);
if ((ret == SOCKET_ERROR)||(ret == 0))
{
bError = 1;
break;
}
nLeft -= ret;
idx += ret;
}
Необхідно звернути увагу на те, як повідомлення закриття програми обробляється у сервері. Це важливо, бо необхідно зарити усі потоки, та видалити усі динамічні змінні.
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
int i;