Каков правильный способ прослушивания сокетов UDS и TCP на сервере на основе `fork()`?

Я пишу сервер на основе fork(), сокеты TCP — это канал связи клиентов с сервером, а сокет UDS (датаграмма, если это имеет значение) — это канал связи консоли управления с сервером.

Каким будет правильный способ прослушивания обоих типов сокетов? Мой сервер в настоящее время выглядит почти так же, как сервер fork() в примере Beej:

while(1) {  // main accept() loop
    sin_size = sizeof their_addr;
    new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
    if (new_fd == -1) {
        perror("accept");
        continue;
    }

    inet_ntop(their_addr.ss_family,
        get_in_addr((struct sockaddr *)&their_addr),
        s, sizeof s);
    printf("server: got connection from %s\n", s);

    if (!fork()) { // this is the child process
        close(sockfd); // child doesn't need the listener
        if (send(new_fd, "Hello, world!", 13, 0) == -1)
            perror("send");
        close(new_fd);
        exit(0);
    }
    close(new_fd);  // parent doesn't need this
}

Как бы вы добавили к приведенному выше коду возможность прослушивания и ожидания соединения в сокете UDS (который уже был привязан).


person Quaker    schedule 11.04.2015    source источник


Ответы (1)


Используйте select(), poll() или epoll() (epoll() предполагает Linux.)

Или используйте несколько потоков.

person Andrew Henle    schedule 11.04.2015
comment
Что вы подразумеваете под несколькими потоками? Я не хочу использовать мультиплексирование ввода/вывода по причине (образовательной). - person Quaker; 11.04.2015
comment
Используйте исходный поток для прослушивания одного порта и запускайте другой для прослушивания другого. - person Andrew Henle; 11.04.2015