Я только что создал небольшую надежную передачу файлов с использованием udp, но она обрабатывает только одного клиента.Поэтому я подумал об использовании fork (), чтобы сервер обрабатывал несколько клиентов.Но я не знаю, как поступить.На данный момент я знаю, что мне не нужно менять клиентскую часть, и именно сервер будет выполнять грязную работу.Любая мысль / идеи о том, как решить эту проблему, очень ценится.Ps.вот как я начал:
void sigchldAction(int sig) {
while (waitpid(-1, 0, WNOHANG) > 0) {
;
}int main(int argc, char *argv[]) {
return;
} //This is my function that waits for all the processes
Вот мой сервер:
int main(int argc, char *argv[]) {
struct sockaddr_in serv_addr;
int port_number, socket_fd;
port_number = atoi(argv[1]);
signal(SIGCHLD, sigchldAction);
if ((socket_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) exit(EXIT_FAILURE);
if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR,
(const void *)&optval, sizeof(int)) < 0) exit(EXIT_FAILURE);
bzero((void *)&serv_addr, sizeof(struct sockaddr_in));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(port_number);
if (bind(socket_fd, (struct sockaddr *)&serv_addr,
sizeof(struct sockaddr_in)) < 0) exit(EXIT_FAILURE);
pid_t child_pid;
while (1) {
child_pid = fork();
switch (child_pid) {
case -1:
perror("Fork() Failed. \n");
exit(EXIT_FAILURE);
break;
case 0:
process_request(socket_fd);
exit(EXIT_SUCCESS);
break;
case 1:
close(socket_fd);
break;
}
}
close(socket_fd);
exit(EXIT_SUCCESS);
}
Тогда моя функция process_request позаботится о любых поступающих данных.