#c #multithreading #server #client
#c #многопоточность #сервер #клиент
Вопрос:
Я работаю над проектом, который включает в себя многопоточный сервер, который теоретически должен иметь возможность принимать любое количество клиентов одновременно. При каждом клиентском подключении к серверу необходимо создавать новый поток для удовлетворения потребностей клиента. Я смущен, играет ли функция listen() какую-либо роль в этом. Это должно быть в бесконечном цикле? Должен ли я одновременно прослушивать только одно клиентское соединение?
Когда я вызываю функцию прослушивания, я передаю дескриптор файла сокета и количество подключений, которое в моем случае я передаю 5. Я не запускаю это в цикле или что-то в этом роде, я просто вызываю это один раз. Однако я не думаю, что это правильный способ сделать это, учитывая необходимую мне реализацию
// now the server can listen
int listennum = listen(socketfd, 5);
if (listennum != 0) {
printf("Listen has failed..n");
exit(0);
}
else {
printf("Server is listening..n");
}
Комментарии:
1.
listen()
Функция должна находиться в бесконечном цикле. Эта функция, как следует из ее названия, продолжает прослушивать клиентские подключения / заявки. Когда поступает клиентское соединение / заявка,listen()
создает другое задание / процесс, который обрабатывает входящее соединение / заявку и снова возвращается к прослушиванию.2. должен ли я вызывать его как listen(socketfd, 1) в бесконечном цикле? или я могу прослушивать несколько подключений одновременно?
3. Нет, @IagoCarvalho, создание
listen
бесконечного цикла никоим образом не требуется. Это толькоaccept()
то, что должно зацикливаться.
Ответ №1:
Я смущен
listen()
, играет ли функция какую-либо роль в этом. Это должно быть в бесконечном цикле?
Нет. listen()
устанавливает свойство сокета, помечая его как пассивный сокет, с помощью которого программа может принимать соединения. Нет необходимости делать это более одного раза. Не забудьте bind()
сначала открыть сокет (что вы также должны сделать только один раз).
Должен ли я одновременно прослушивать только одно клиентское соединение?
На самом деле это не та концепция, которую предоставляет интерфейс сокета, хотя существует связанная концепция того, сколько соединений, ожидающих принятия, могут быть поставлены в очередь для сокета одновременно. Это контролируется вторым параметром to listen()
.
Когда я вызываю функцию прослушивания, я передаю дескриптор файла сокета и количество подключений, которое в моем случае я передаю 5. Я не запускаю это в цикле или что-то в этом роде, я просто вызываю это один раз.
Это именно то, что вы должны сделать, но это не единственное, что вы должны сделать.
Однако я не думаю, что это правильный способ сделать это, учитывая необходимую мне реализацию
Возможно, вы упускаете из виду, что после вызова listen()
вы должны использовать accept()
функцию для фактического приема подключений. Это то, что вы хотите запустить в цикле. Вы можете принимать любое количество подключений из одного и того же прослушивающего сокета.
Комментарии:
1. итак, и listen(), и accept() должны быть в циклах, или я могу вызвать listen() один раз, а затем выполнить цикл для accept()?
2.
listen
один раз.accept
столько раз, сколько потребуется. Я не уверен, как этот ответ, как уже написано, дает другую интерпретацию.