клиент-серверная архитектура с несколькими клиентами - PullRequest
2 голосов
/ 04 февраля 2012

Мне нужно реализовать серверный / клиентский код на языке 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 ]

2 голосов
/ 04 февраля 2012

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

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

На этой странице показана блок-схема вышеуказанного процесса.(Прокрутите вниз, чтобы найти очень хорошо аннотированный пример.)

Эта страница полна примеров для select.

1 голос
/ 04 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...