Вот такой вопрос: когда я делаю после accept в родительском процессе fork, закрываю вроде бы все ненужное и запускаю обработчик:
while (1) {
struct sockaddr_in remote;
socklen_t sockaddr_len = sizeof(remote);
int clientsocket = accept(listensocket, (struct sockaddr*)&remote, &sockaddr_len);
if (clientsocket < 0) {
perror("Accept failed");
return EXIT_FAILURE;
}
printf("Connected %s:%d\n", inet_ntoa(remote.sin_addr), ntohs(remote.sin_port));
switch(fork()){
case -1:
perror("fork");
break;
case 0:
close(listensocket);
close(0); close(1); close(2);
client_worker(clientsocket);
exit(0);
default:
close(clientsocket);
}
}
Вопрос: как правильно закрывать сокеты?
Дополнительный вопрос: при работе в «приватном» режиме мне не нужны процессы — я хочу лишь запускать отдельные потоки подсоединяющимся «неприватным» клиентам и только отсылать им нужную часть информации, игнорируя прием (закрывать принимающий канал нельзя, а то клиент отвалится). Не будет ли здесь проблем с невесть откуда берущимися трубами или еще какой фигней?