Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.007 c
1-55189
Stass
2002-06-05 00:06
2002.06.17
MDI


1-55157
limon
2002-06-04 11:08
2002.06.17
Кредитные карточки


1-55132
vald
2002-06-04 09:04
2002.06.17
Возможность вертикальной ориентации текста при печати


1-55138
Goblinus
2002-06-03 23:23
2002.06.17
Преобразование из Char в Integer и обратно


7-55326
HVS
2002-03-10 11:25
2002.06.17
Состояние телефонной линии после набора номера





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский