Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.12;
Скачать: CL | DM;

Вниз

Как проще всего сразу отказать клиенту ?   Найти похожие ветки 

 
KPOT   (2002-05-09 13:22) [0]

Уважаемые знатоки, не подскажете ли как сервер может сразу не акцептировать новое соединение с клиентом без вызова OnGetThread? и второй вопрос А если OnGetThread все-таки происходит обязательно ли создавать и запускать поток?


 
прапр   (2002-05-09 17:07) [1]

Удалено модератором


 
KPOT   (2002-05-10 13:46) [2]

Хехе.
Такой простой вопрос,может у кого нить есть ещё предложения?


 
panov ©   (2002-05-10 21:59) [3]

TServerSocket.Close;


 
KPOT   (2002-05-13 13:17) [4]

Хмм...
Мне нада примерно так:
Новый клиент должен коннектится тока по запросу, а если законнектился какой-то другой клиент без запроса, его можна сразу Клозе, не создавая потока.

Можна ли так сделать?


 
Reindeer Moss Eater   (2002-05-13 13:39) [5]

А этот запрос по твоему "через космос" должен прийти еще до акцептирования соединения?


 
KPOT   (2002-05-13 14:32) [6]

запрос я посылаю через другую connection...



 
Malder ©   (2002-05-13 21:51) [7]

KPOT, не слишком ли мудрено ?

Опиши поподробнее, тут же не телепаты сидят, чтобы читать мысли, что ты запрос посылаешь через другую connection...


 
KPOT   (2002-05-14 14:25) [8]

А мне на вопрос хоть кто-нить ответит ? :)

Please...


 
KPOT   (2002-05-28 12:35) [9]

Auuu...


 
Digitman ©   (2002-05-28 16:48) [10]

Может. Только на платформах, начиная с W2k. Но без капитальной переделки TServerSocket не обойтись.

Ключевой момент здесь - необходимость явного вызова ф-ции SetSockOpt() для установки опции слушающего гнезда SO_CONDITIONAL_ACCEPT до момента вызова ф-ции listen().


 
KPOT   (2002-05-30 12:06) [11]

2DigitMan...
Spasiba, naverno ja tak slozhno delat" ne budu.
A vot tak budet normal"no rabotat"?

procedure TForm1.ProxyGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
var
myTh: TMyThread ;
bSended : boolean;
ss: TList;
buf1 : Array[0..49] Of char;
l : integer;
begin

strcopy( buf1, PChar( mb_connect + trim(Mapserver.Text) ) );

bSended := false;
ss := SystemThread.LockList;
if ss.Count > 0 then begin
try
bSended := ( TSCThread(ss.Items[0]).inStream.Write(buf1, SizeOf(buf1) ) = SizeOf(buf1) );
except
bSended := false ;
end;
end;
SystemThread.UnlockList;

if bSended then begin
SocketThread := TSCThread.Create(true,ClientSocket );
with TSCThread(SocketThread) do begin
KeepInCache := false;
FreeOnTerminate := TRUE;
inStream := TWinSocketStream.Create(ClientSocket, 60000);
end;

myTh := TMyThread.Create( True);
myth.ProxyThread := TSCThread(SocketThread) ;
myth.ServConn := NewConnection;
myth.FreeOnTerminate := TRUE;
myth.thList := thList;
myth.Resume;
end else begin
ClientSocket.Close;
SocketThread := TServerClientThread.Create(true,ClientSocket ); // Mozhno li tak delat"? SocketThread.KeepInCache := false;
SocketThread.Resume;
end;
end;


 
Digitman ©   (2002-05-30 13:25) [12]

Понятие "акцепт/режект сервера клиентского запроса на соединение"(1) никак не связано с понятием "транспортный поток соединения"(2).

(2) всегда зависит от (1).
Если результатом (1) будет режект, то ни о каком (2) не может быть и речи - соединение между клиентом и сервером не установлено (клиент в ответ на SYN-пакет получает RST-пакет, соответствующий режекту, вместо ACK-пакета, соответствующего акцепту) по причине отказа сервера в соединении с клиентом. Раз соединение не установлено, то и трансп.поток ни к чему.

TServerSocket из соображений совместимости с большинством Win32 ОС никогда не задействует гнездовые опции, позволяющие осуществлять режект клиентского запроса (по сути режект есть один из 3-х результатов условной обработки сервером вх.запросов на соединение). А, значит, всегда и безусловно акцептирует любой кл.запрос на соединение.

С т.з. клиента это означает, что соединение с сервером (если параметры коннекта корректны и сервер активен) будет установлено безусловно, т.е. ClientSocket.Open завершится успешно, фиксируя факт установления TCP-соединения с сервером. Если бы TServerSocket мог реализовать условное акцептирование запроса и в ответ на такой запрос при заданных условиях отверг бы его(выполнил режект), то метод ClientSocket.Open завершился бы с отказом, диагностируемым как "сервер отверг запрос на соединение".

С т.з. сервера, реализованного на TServerSocket, это означает, что событие OnAccept() возникает как факт УЖЕ установленного соединения (т.е. метод TClientSocket.Open на кл.стороне завершился успешно и клиент, возможно, в это самое время уже пытается что-то посылать серверу по успешно созданному транспортному каналу).
Сразу же за OnAccept() возникает событие OnGetSocket(), котором сервер дает возможность создать экземпляр наследника класса TServerClientWinSocket. Если возможность проигнорирована и возвращен nil, сервер безусловно и самостоятельно по-умолчанию создаст экз-р класса TServerClientWinSocket, который будет управлять транспортом тек.соединения.

Если режим работы сервера stThreadBlocking, следом же за OnGetSocket() возникает событие OnGetThread(), предлагающее создать экз-р наследника TServerClientThread. Возврат nil так же не говорит об отказе в организации транспорта - канал-то существует ! - сервер, получив nil, по-умолчанию создаст класса TServerClientThread.

Ни в одном из обработчиков этих событий (OnGetSocket(), OnGetThread() и OnAccept()) нельзя выполнять метод TServerClientWinSocket.Close в надежде разорвать только что установленное соединение, дабы "выкинуть" клиента из списка подключившихся, не дав ему и "открыть рта". Корректное закрытие соединения может быть осуществлено лишь выполнением Connections[..].Close либо ServerSocket.Close ВНЕ тел обработчиков данных методов. Но ! Закрытие соединения практически сразу после его установления не имеет ничего общего с настоящим механизмом отвержения кл.запроса на соединение.


 
KPOT   (2002-05-30 13:51) [13]

Spasiba za osnovatel"nyj otvet.
Esli ja vse-taki pravil"no ponjal potok mne nada sozdavat" vsegda vne zavisimosti ot bSended i etu zhe bSended prisvoit" sootvestvennoj peremennoj potoka.
A kogda moj potok startujet on proverit etu peremennuju i esli ona FALSE mozhet s 4istoj sovest"ju vyzvat" metod TServerClientThread.ClientSocket.Close i zavershitsja ( tak zhe ne dav klientu otkryt" rta) ?
Ili nada by sdelat" eto kul"turnej( tipa dat" klientu vyskazat"sja i potom TServerClientThread.ClientSocket.Close )?
Kak pravil"nej ?

Zaranee spasibo


 
Digitman ©   (2002-05-30 14:24) [14]

если твой сервер (в коде стартованного тобой потока) явно определил, что подключившийся клиент нежелателен, то вполне может и не ждать ничего от клиента, а просто закрыть его гнездо и тут же завершиться. В ином случае можно организовать handshacking ("рукопожатие") : ждать в теч.опред.времени неких данных от клиента, если ничего не получено - закрыть соединение, если что-то получено и не соответствует ожидаемому - так же закрыть соединение, в против.случае - "приветствовать" клиента и ждать от него очер.запросы для обработки


 
KPOT   (2002-05-30 14:56) [15]

2Digitman.

Ok.
Spasiba.
Budem znat"!



Страницы: 1 вся ветка

Текущий архив: 2002.08.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
1-35273
Игорь С.
2002-07-31 15:08
2002.08.12
Чтение файла в буфер, для последующей работы...


14-35409
Malder
2002-07-10 01:15
2002.08.12
Локальная сеть


3-35142
Loco
2002-07-21 16:02
2002.08.12
SQL


1-35327
GTA 3
2002-07-29 21:03
2002.08.12
Сохранение строки в файл, НО в опр. строку по счёту


14-35468
Lola
2002-07-15 17:08
2002.08.12
Советую обратить внимание начинающим и не очень.