2012-02-03 5 views
2

Мне нужно реализовать код сервера/клиента в C. Сервер должен иметь возможность принимать ровно четыре соединения в то время.
Я не могу заставить это работать. То, что я сделал до сих пор:
1. создать сокет
2. Установите его в неблокируемой: fcntl(sock,F_SETFL, O_NONBLOCK);
3. привязать его
4. слушать: listen(sock, 4);клиент/серверная архитектура с несколькими клиентами

ту часть, которую я не являюсь совершенно уверен, как принять соединение с клиентом. Мой код выглядит примерно так:

while (1) { 
    if ((sockfd = accept(sock, (struct sockaddr *) &client_addr, &client_size)) < 0) { 
      perror("Error\n"); 
    } 
    read(sockfd, &number, sizeof(number)); 
    write(sockfd, &number, sizeof(number)); 
} 

Когда я исполняю клиент и коды сервера, клиент, кажется, что-то писать в сокет, который сервер не получает и целые блоки исполнения. Каков правильный способ принимать соединения от нескольких клиентов?

ответ

2

Одним из основных рабочих процессов для такого сервера, если вы не хотите использовать многопоточность, как это:

  • Создать fd_set дескрипторов файлов, чтобы наблюдать за чтение
  • открыть сокет
  • Bind сокет к порту для прослушивания
  • Начало прослушивания на сокете
  • Добавить сокета файл дескриптора т О, fd_set
  • Пока не сделано
    • Используйте select ждать, пока сокет не будет готов для чтения из
    • петли через СОБ в вашем fd_set, что есть данные, доступные
    • Если текущие ФД сокет прослушивания , принять новое соединение
    • Else, это клиент fd. Прочтите от него и, возможно, напишите обратно.

This page показывает блок-схему описанного выше процесса. (Прокрутите вниз для очень красивого аннотированного примера.)

This page является полным набором примеров для select.

+0

Большое вам спасибо за подробное объяснение. Наконец-то я получил его на работу! – Maggie

1

Вы должны посмотреть человека select. Он сообщит вам, когда и какие сокеты готовы писать/читать