Правильный способ принять несколько клиентов? - PullRequest
1 голос
/ 18 апреля 2019

Я работаю над проектом, который включает в себя многопоточный сервер, который теоретически должен быть способен принимать любое количество клиентов одновременно. При каждом клиентском подключении к серверу необходимо создавать новый поток для удовлетворения потребностей клиента. Я запутался, играет ли функция 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 Ответ

0 голосов
/ 19 апреля 2019

Я не уверен, играет ли функция listen() какую-либо роль в этом.Это должно быть в бесконечном цикле?

Нет.listen() устанавливает свойство сокета, помечая его как пассивный сокет, с помощью которого программа может принимать соединения.Нет необходимости делать это более одного раза.Не забудьте сначала bind() сокет (что также следует сделать только один раз).

Должен ли я одновременно прослушивать только одно клиентское соединение?

Это не совсем концепция, которую предоставляет интерфейс сокетов, хотя есть связанная концепция того, сколько соединений, ожидающих принятия, могут быть поставлены в очередь для сокета одновременно.Это управляется вторым параметром listen().

Когда я вызываю функцию прослушивания, я передаю дескриптор файла сокета и количество соединений, которое в моем случае я передаю 5. Я делаюне запускайте это в цикле или чем-то еще, я просто называю это один раз.

Это именно то, что вы должны сделать, но это не only , что вы должны делать.

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

Возможно, вам не хватает того, что после вызова listen() вы должны использовать *Функция 1030 * для фактического приема соединений. Это - это то, что вы хотите запустить в цикле.Вы можете принять любое количество подключений от одного и того же прослушивающего сокета.

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