-
> Запустил клиента и тут же пинком выгнал его без объяснения > ему причин в отказе обслуживания.Зачем, спрашивается, тогда > вообще нужно было его запускать ?
А ему, клиенту, какая разница? Он ведь не живой ))) Так правильно я сделал или нет? Обеспечивает ли мой код работу только с одним клиентом?
-
> Ты немного не правильно представляешь себе ситуацию. Когда > соединение устанавливается через слушающий сокет - для него > создается отдельный сокет, хэндл которого тебе и возвращает > accept. После чего слушающий можно закрывать и работать > с установленным соединением.
Все я правильно понимаю. Мне не нужно закрывать слушающий сокет ибо сервер будет работать 24/7. Мн нужно ждать новых клиентов и даже работать с ними, если "очередь" пуста.
-
> Да, я действительно делаю Accept
Для чего?
-
> Мне не нужно закрывать слушающий сокет ибо сервер будет > работать 24/7.
Так тыж сам сказал что тебе нужно только одно соединение. Вопрос, нафига тебе сервер, если соединение уже установлено? Не, ну если нужно - значит нужно...
-
> клиенту, какая разница? Он ведь не живой
Как это какая ? И как это не живой ?
Ты ж его запустил в ларек и он справедливо полагает что сейчас его обслужат, раз уж он вошел).. А ты и не собираешься его обслуживать - ты другим, перед этим вошедшим клиентом в этот момент занят - вновь вошедшему ты попросту молча даешь пинка).. Зачем тогда пускал его ?))
-
В схеме по умолчанию происходит вот что:
// момент 0 Listen(ListeningServerSocket, 5); .. // момент 1
в этот момент из 10-ти потециальных клиентов, попытавшихся законнектиться, подтверждение коннекта УЖЕ получат первые пятеро из них (ВНЕ зависимости от того что ни одна Accept() сервером еще не выполнена ) и они будут ждать обслуживания, остальные же пять получат отлуп. .. // момент 2 // здесь для обслуживания очередного клиента из пяти УЖЕ законнекченных создается ассоциированное с ним отдельное кл.гнездо, без которого собственно обслуживание этого клиента не возможно
NewClientConnectionSocket := Accept(ListeningServerSocket, ..); .. // момент 3 // очередь уменьшилась на 1, теперь 1 из 5-ти клиентов, получивших ранее отлуп, при повторной попытке может успешно законнектиться, оставшиеся 4 по прежнему получат отлуп
-
Accept() выгребает из очереди УЖЕ законнекченных клиентов (если таковые там имеются) очередного клиента, создает и ассоциирует с ним сокет.
Если очередь пуста, Accept() ждет ее пополнения (в блок. режиме) либо запускает операцию ожидания (в неблок. режиме) и возвращает управление.
|