Прослушивание нескольких портов и прием соединений - PullRequest
0 голосов
/ 18 мая 2018

Это пример моего кода.Я создал два сокета, открыл два порта и пытался принимать соединения.Все мои файловые дескрипторы установлены на NONBLOCK.

Дескриптор файла fd_client_serv используется для приема HTTP-запросов GET через порт 8080.

Дескриптор файла fd_client_comm используется для принятиякоманды на моем сервере от клиента в порту 9090.

Когда я отправляю запрос HTTP, я хочу прочитать запрос и просто напечатать первую строку.Но иногда это работает, а иногда нет.Пока сервер работает, я использую curl для отправки запроса.Иногда сервер продолжает печатать сообщение, а иногда нет.Я предполагаю, что есть проблема с двойной accepting.

Не могли бы вы мне помочь?

while(1)
{
    if((fd_client_serv = accept(fd_serv, (struct sockaddr *) &client_serv_addr, &sin_len_serv)) != -1)
    {
        new_fd = fd_client_serv;
        fd_set_blocking(new_fd, 0);
    }
    if((fd_client_comm = accept(fd_comm, (struct sockaddr *) &client_comm_addr, &sin_len_comm)) != -1)
    {
        temp = fd_client_comm;
        fd_set_blocking(temp, 0);
    }

    if (temp != 0)
    {
        if (server_commands(fd_comm, temp, start_time) == 1)
            break;
    }
    if (new_fd != 0)
    {
        i = 0;
        while ((bytes_read = read(new_fd, &(message[i]), 1)) != -1)
        {
            if (message[i] == '\n')
                break;
            i++;
        }
        printf("%s\n", message);
        write(new_fd, "return message", 14);
        memset(message, 0, 100);
        close(new_fd);
        new_fd = 0;
    }
}

1 Ответ

0 голосов
/ 18 мая 2018

Если сокет прослушивания не установлен неблокирующим, функция accept() блокирует до тех пор, пока соединение не будет принято.Даже если ваши прослушивающие сокеты были неблокирующими, у вас был бы занят занятый цикл.Таким образом, хотя наличие двух accept() вызовов на итерацию цикла не является по своей сути неправильным, вы вряд ли сможете заставить их работать хорошо вместе.

Вместо этого рассмотрите одну из этих альтернатив:

  • разветвляет отдельный дочерний процесс для обработки каждого порта службами приложений, или
  • обслуживает каждый порт отдельным потоком, или
  • использует select(),poll() или аналогично обработке мультиплексного ввода-вывода для нескольких портов и / или нескольких одновременных клиентов.
...