Сокеты в Unix

Тема в разделе "Общие вопросы по С и С++", создана пользователем alexdrob, 5 апр 2011.

Статус темы:
Закрыта.
  1. alexdrob

    alexdrob Гость

    Как я понял из статей, чтобы сокет сделать не блокируемым, нужно вызвать функцию
    Код (C++):
    fcntl(sd, F_SETFL, O_NONBLOCK);
    и для каждого подключенного клиента тоже.

    Вот назрел вопрос, а как сделать ожидание клиентов в основном потоке, а опрос подключившихся в дополнительном. Идея примерно такая

    основной поток
    Код (C++):
    std::set<ClientSocket*> clients;
    clients.clear();
    while(1)
    {
    fd_set readset;
    FD_ZERO(&readset);
    FD_SET(sd, &readset);

    timeval timeout;
    timeout.tv_sec = 15;
    timeout.tv_usec = 0;

    if(select(sd+1, &readset, NULL, NULL, &timeout) <= 0)
    {
    perror("Erorr socket select");
    exit(1);
    }

    if(FD_ISSET(sd, &readset))
    {
    ClientSocket* sock = new ClientSocket(sd);

    if(sock->getSock() < 0)
    {
    perror("Erorr socket accept");
    exit(1);
    }

    fcntl(sock->getSock(), F_SETFL, O_NONBLOCK);

    printf ("New client connected\n");

    clients.insert(sock);
    }
    }
    Но проходит таймаут и программа завершается.

    Можно ли сделать основной сокети, который ждёт подключения клиентов блокируемым, а подключившихся клиентов н*цензура*кируемыми, что то типа
    Код (C++):
    while(1)
    {
    sock = accept(listener, NULL, NULL);
    fcntl(sock->getSock(), F_SETFL, O_NONBLOCK);
    clients.insert(sock);
    }
    Как бы основной поток будет виснуть на accept пока не появится новый клиент, а если появится сокет новый станет асинхронным. А основной останется синхронный. Или как сделать правильней?
     
Загрузка...
Похожие Темы - Сокеты Unix
  1. areostar
    Ответов:
    1
    Просмотров:
    215
  2. 123456789igor
    Ответов:
    0
    Просмотров:
    918
  3. iosif88

    Сокеты

    iosif88, 17 дек 2009, в разделе: .NET
    Ответов:
    1
    Просмотров:
    1.713
  4. acorn
    Ответов:
    13
    Просмотров:
    4.839
  5. Баламут
    Ответов:
    2
    Просмотров:
    3.121
Статус темы:
Закрыта.

Поделиться этой страницей