Как ограничить количество соединений в клиент-серверной программе
Я хочу серверную программу, которая должна принимать не более одного соединения, и она должна отбрасывать другие соединения. Как мне этого добиться?
3 ответа
Только accept()
одиночное соединение.
Вот типичная серверная процедура:
s = socket(...);
bind(s, ...);
listen(s, backlog);
while (-1 != (t = accept(s, ...))) {
// t is a new peer, maybe you push it into an array
// or pass it off to some other part of the program
}
Каждый завершен accept()
call, возвращает дескриптор файла для нового соединения. Если вы хотите получить только одно соединение, только accept()
один раз. Предположительно, вы закончили прослушивание после этого, поэтому закройте свой сервер тоже:
s = socket(...);
bind(s, ...);
listen(s, backlog);
t = accept(s, ...);
close(s);
// do stuff with t
Если вы хотите обрабатывать только одно соединение за раз, и после того, как это соединение закрывается, возобновите прослушивание, затем выполните accept()
цикл выше, и принимайте дальнейшие соединения, пока t
закрыл
Исправления см. Ниже:Вы можете определить количество принятых запросов в методе прослушивания.
listen(socketDescription, numberOfConnectionsPending);
Второй параметр предназначен для установки количества ожидающих соединений, а не количества самих соединений.
Если для параметра numberOfConnections задано значение 1, все другие клиенты, отправляющие запрос на сервер, получат ошибку тайм-аута.
Здесь вы можете найти больше информации: http://shoe.bocks.com/net/
Я прочитал документацию прослушивания неправильно. Вы должны работать с методом принятия, который описан в ответе Мэтта.
Вы хотите отклонить все соединения или сделать очередь? Я думаю, что вы ищете так называемый "синглтон". Посмотрите на википедию для шаблона проектирования Singleton.