Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
8-35385
Prorva
2002-04-08 23:11
2002.08.12
Надо написать подобие Paint (графического редактора)


14-35431
Baz
2002-07-15 13:59
2002.08.12
Вопрос врачам или спортсменам


1-35266
Lena
2002-07-29 02:24
2002.08.12
OLE в RichEdit


7-35487
snoup
2002-04-29 22:56
2002.08.12
Как сделать что бы твою прогу не было видно в КОНТР+АЛЬТ+ДЕЛ.


7-35477
omckma
2002-05-15 10:41
2002.08.12
Системная дата и время





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский