Witam,
Piszę wielowątkową aplikację serwerową, w której każdego klienta obsługuje osobny wątek. Używam funkcji read/write, włączyłem działanie asynchroniczne:
int flags;
flags = fcntl(socket,F_GETFL,0);
assert(flags != -1);
fcntl(socket, F_SETFL, flags | O_NONBLOCK);
Obsługę socketa robię tak:
for ( ; ; )
{
memset(pClient.data_buff, 0x00, sizeof(pClient.data_buff));
n = read( *pClient.con_fd, (void *)pClient.data_buff, bytes_to_read );
if (n == 0)
{
printf("Connection reset by peer!\r\n");
//tu zwalniam zasoby i niszcze watek
}
else if (n == -1) //tu wysylamy dane
{
switch(value) //tu cos robie i np wysylam dane do klienta
{
case 1:
...
break;
default:
...
break;
}
value = 0;
usleep(5000); //opoznienie 5ms, zeby nie zrzeralo proca, no wlasnie...
}
else //tu odbieramy
{
make_packet(&pClient, n);
}
}
usleep(5000); zastosowałem, gdyż bez wstrzymania, jeden wątek zabierał 100% zasobów procesora. Przy zwłoce 5ms, zużycie procesora przy 2 działających wątkach oscyluje w okolicy 1%. Ale aplikacja w tym czasie nic nie robi, nie ma komunikacji sieciowej.
Pytanie:
Jak rozwiązać obsługę socketa, tak abym miał możliwość równocześnie pisać/czytać z klientem oraz, żeby nie zajmowało to zbędnych zasobów procesora?