Форум: "Сети";
Текущий архив: 2002.08.12;
Скачать: [xml.tar.bz2];
ВнизКак проще всего сразу отказать клиенту ? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c