Форум: "Сети";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
ВнизЯ использую Сокеты. Вот вопрос следующий как не дать клиенту соед Найти похожие ветки
← →
Fredericco (2002-04-08 14:08) [0]Как не дать клиенту соединиться?
То есть я попадаю в обработчик событияOnClientConnected
по скажем 1000 порту а у меня на этом порте уже кто-то висит и данному клиенту я не хочу давать связь. Как?
← →
Digitman (2002-04-08 14:17) [1]В том виде, как механизм акцептирования сервером входящих клиентских запросов на соединение реализован в TServerSocket - никак. Если сервер корректно "слушает" на заданном порту, то в момент возбуждения события TServerSocket.OnClientConnect() клиент уже получил подтверждение коннекта и вправе считать, что сервер успешно акцептировал его (клиентский) запрос на соединение (о чем, собственно, и свидетельствует возбуждение события TClientSocket.OnConnect() на клиентской стороне).
← →
Fredericco (2002-04-08 17:30) [2]Digitman >> Так как же мне его сбросить? Не дать соединения?
← →
SerVS - S (2002-04-08 18:04) [3]Клиента пишешь ты? Если да то шли ему сообщение мол сервер занят, и пусть сам рвет конект
← →
Fredericco (2002-04-08 18:30) [4]SerVS - S >> Причем сервер тоже я! Но вот если злостный юзер напишет свой клиент и не будет отключаться а наоборот какую-нибудь гадость пошлет?
← →
yaJohn (2002-04-08 19:19) [5]TServerSocket.OnAccept
← →
Fredericco (2002-04-08 19:42) [6]yaJohn >> Вешаю на это событие сообщение мол принимать клиента или нет, и пока сообщение висит клиент шлет что хочешь!
← →
yaJohn (2002-04-08 19:48) [7]>Вешаю на это событие сообщение
Пардон... Можно перевести на понятный?
← →
Digitman (2002-04-09 08:12) [8]>Fredericco
В случае с TServerSocket для разрыва связи с нежелательным клиентом достаточно в событии OnAccept() просто закрыть только что установленное соединение вызовом Socket.Close (где Socket - параметр процедуры обработки события, отражающий контекст только что установленного соединения с клиентом)
← →
Fredericco (2002-04-09 09:36) [9]yaJohn >>
procedure TForm1.ServerSocket1Accept(Sender: TObject;
Socket: TCustomWinSocket);
begin
if MessageDlg("Accept?",
mtConfirmation, [mbYes, mbNo], 0) = mrNo then Socket.Close;
end;
Пока я выбираю нажать да или нет клиент может послать любую информацию и сервер ее спокойно примет!
← →
Digitman (2002-04-09 09:55) [10]>Fredericco
Каким же образом "спокойно примет" ? Гнездо-то ты закрыл здесь, в событии OnAccept()
← →
Fredericco (2002-04-09 11:40) [11]Digitman >> В процессе закрытия пусть даже секунда (я быстро нажимаю кнопку No :-)) сервер все принимает.
← →
Digitman (2002-04-09 12:19) [12]>Fredericco
Это потому, что ты неверно задумал и реализовал логику отвержения соединения (CONNECTION REFUSE).
1. Какой реальный смысл формировать модальное диалоговое окно с запросом неизвестно кому, мол, ответь - No или Yes ? Что, ты посадишь за машину, где TServerSocket будет "крутиться по хозяйству" специального человечка, вся "мартышкина" задача которого - сидеть, ковыряя в носу в ожидании новых коннектов с тем, чтобы при запросах на оные надавить на одну из кнопок ?
В штатном режиме сервер должен обслуживать/отвергать клиентов автоматически ! На то он и сервер. А заблаговременное формирование (или оперативная коррекция) блока информации о желательных и нежелательных клиентах (remote hostnames, remote IP-addresses, remote ports e.t.c) должно быть возложено на администратора сервера, который далеко не "мартышка" и такой фигней заниматься не должен и не будет.
В момент возникновения события OnAccept() объект Socket: TCustomWinSocket, передаваемый параметром в обработчик, уже способен при вызове соотв-щих его методов выдать инф-цию о как минимум remote IP-address и remote port number клиента, осуществившего коннект. Задача же обработчика OnAccept() - запросив эти сведения у Socket:TCustomWinSocket, локализовать их в том самом блоке инф-ции, что подготовил сисадмин, и в случае обнаружения некоего предопределенного сисадмином признака нежелательности данного клиента - тут же вызвать Socket.Close. При этом канал связи с клиентом разрывается и Socket:TServerClientWinSocket уже не вызовет как минимум события OnClientRead(), за которое ты так волнуешься. А еще лучше, если проверка и дисконнект гнезда будет осуществляться при такой логике в событии OnClientConnect() (оно все равно возникнет, если даже в OnAccept() гнездо закрыть; это, imho, несколько усложнит проверки в OnClientConnect)
2. В момент ожидания нажатия пользователем столь приглянувшейся тебе кнопки "No" осн.поток системы находится в состоянии ожидания ввода и способен обрабатывать любые события, в т.ч. и события гнезда. Что, собственно говоря, ты и наблюдаешь : активное клиентское гнездо сервера, приняв данные от того самого нежелательного клиента, посылает в осн.потоке окну объекта TServerWinSocket сообщение, фиксирующее этот факт, и, как следствие - TServerSocket возбуждает события OnClientWrite() и OnClientRead().
← →
Fredericco (2002-04-09 12:29) [13]Digitman >> Спасибо за разъяснения. Задумка была не мартышка а файрвол, ну да Бог с ним. Если есть время глянь на другое мое сообщение в этом форуме (оно тоже про сокеты). Еще раз спасибо.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c