Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];

Вниз

Socket & Thread, не могу понять в чем проблема   Найти похожие ветки 

 
neodiX   (2002-10-04 11:44) [0]

Есть ServerSocket, type=threadblocking, беру стандартный пример из хелпа, смотрите ниже:
procedure TMyServerThread.ClientExecute;
var
Stream : TWinSocketStream;
Buffer : array[0 .. 9] of Char;
begin
while (not Terminated) and ClientSocket.Connected do
begin
try
Stream := TWinSocketStream.Create(ClientSocket, 60000);
try
FillChar(Buffer, 10, 0);
if Stream.WaitForData(60000) then
begin
if Stream.Read(Buffer, 10) = 0 then
ClientSocket.Close;
if buffer="stop" then clientsocket.Close; //это мое
end
else
ClientSocket.Close;
finally
Stream.Free;
end;
except
HandleException;
end;
end;
end;

жду команду от клиента (ClientSocket1 type=nonblicking). Клиент посылает "stop", как только сервер получает эту команду, он должен разорвать связь с клиентом. Вроде все просто... но после разрыва связи выкидывает ерор, сначала "EAccessViolation in address ....", a потом всегда "ЕOSError, SystemError, code:5 Access is denied!"
Так вот, почему EAccessViolation, что я не освобождаю или куда не так обращаюсь?
и почему Аccess is denied, как написано в хэлпе, поток terminating , сразу после event"a OnClientDisconnect, т.е. как я понимаю мне его убивать не надо.
Если кто знает в чем проблема, помогите, хотя бы ссылками на эту тему!


 
Digitman   (2002-10-04 12:03) [1]

>>но после разрыва связи выкидывает ерор

Кто выкидывает-то ? Клиент ? Сервер ?


 
neodiX   (2002-10-04 12:06) [2]

Server


 
neodiX   (2002-10-04 12:18) [3]

Поток oписан так:
TMyServerThread = class(TServerClientThread)
procedure clientexecute; override;
end;
...
var fred: TMyServerThread

В event"e OnGetThread пишу:
fred:=TMyServerThread.create(false,Clientsocket)





 
Digitman   (2002-10-04 12:24) [4]

1. Какие события и как конкретно ты обрабатываешь на серверной стороне (кроме GetThread и GetSocket) ?

2. Если клиент ничего не посылает серверу, а просто сразу же выполняет на своей стороне Socket.Close - та же ситуация ? Или - все корректно ?


 
neodiX   (2002-10-04 12:48) [5]

1. Никакие (даже не использую GetSocket... (если надо обрабатывать onGetSocket, то как?))
2. Когда клиент ничего не посылает, а просто делает ClientSocket.Close возникает та же ошибка.


 
Digitman   (2002-10-04 12:57) [6]


> В event"e OnGetThread пишу:
> fred:=TMyServerThread.create(false,Clientsocket)


А это что еще за "fred" такой ?
Приведи-ка текст обработчика OnGetThread() целиком ! Никаких fred"ов там в помине нет.
А есть там
var SocketThread: TServerClientThread

Вот этому самому SocketThread ты и должен присвоить в обработчике значение, равное адресу создаваемого тобой экз-ра класса TMyServerThread = class(TServerClientThread)


 
neodiX   (2002-10-04 13:06) [7]

fred oписан в var части перед implementation. Смотрите (04.10.02 12:18)
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
fred:=TMyServerThread.create(false,clientsocket);
end;

так если fred не нужно, так как мне перекрыть procedure clientsocket;

> ты и должен присвоить в обработчике значение, равное адресу
> создаваемого тобой экз-ра класса TMyServerThread = class(TServerClientThread)

это т.е. типо этого:
socketthread:=tmyserverthread.Create(false,clientsocket);


 
neodiX   (2002-10-04 13:07) [8]

sorry, перекрыть procedure clientexecute


 
neodiX   (2002-10-04 13:12) [9]

2 Digitman,
Вот это помог!!!
как я и написал выше
>socketthread:=tmyserverthread.Create(false,clientsocket);
так сразу все заработало.
Огромное спасибо за то что помог во всем разобраться! Иду пытать сокеты и потоки дальше.



 
Digitman   (2002-10-04 13:13) [10]

да, "это т.е. типо этого":

socketthread:=tmyserverthread.Create(false,clientsocket);

а "перекрытие виртуального метода" - это из другой оперы


 
Digitman   (2002-10-04 13:30) [11]

Дык ыть - чего там разбираться-то ?)
Черным же по белому в хэлпе написано :

Write an OnGetThread event handler to create a specialized descendant of TServerClientThread for the connection to the client socket. Create the new thread with the CreateSuspended parameter set to False, and return it in the SocketThread parameter. OnGetThread only occurs if there are no idle threads in the cache.



 
neodiX   (2002-10-07 14:01) [12]


> OnGetThread only occurs if there are no idle threads in
> the cache

да это заметил, т.е. когда я первый раз подсоединяюсь к серверной части то все ОК, когда отсоединяюсь тоже все ОК, но когда вновь присоединяюсь то на сервере срабатывает оngetsocket,а оngetthread нет. A чо в ongetsocket писать?
если писать так:
clientsocket:=TServerClientWinSocket.Create(socket,????);
то как со вторым параметром, мне его самому описать?
Его тип TServerWinSocket, чо мне потом с этой переменой делать?


 
Digitman   (2002-10-07 14:17) [13]

>>чо в ongetsocket писать?
>>чо мне потом с этой переменой делать?

Ни<>чо. Можешь вообще ни чо не писать - никто не обязывает тебя вообще обрабатывать событие OnGetSocket.

Черным же по белому написано в хэлпе :

Write an OnGetSocket event handler to create a specialized TServerClientWinSocket object to use in the connection represented by the Socket parameter.

Return the new TServerClientWinSocket object in the ClientSocket parameter.

Кроме как параметр ClientSocket никаких иных параметров заполнять не требуется. Этим параметром ты волен передать либо nil либо ссылку на собственноручно создаваемый экземпляр наследника TServerClientWinSocket.


 
neodiX   (2002-10-07 14:25) [14]

Но дело в том, что когда клиент первый раз отсоединяется, то срабатывает onClientDisconnect на сервере, потом делается terminate thread"a. Когда я повтроно соединяюсь то сервер не запускает ongetthread, а у клиента все ок, т.е. срабатывает onclientconnect без ошибок. Но сервер то молчит, никакой поток не запустил? Я уверен что где то, что то не дописываю, только вот где?


 
neodiX   (2002-10-07 14:29) [15]

а когда передаю nil, то выкидывает еррор, типа Access violation at ###


 
Digitman   (2002-10-07 14:41) [16]

>>потом делается terminate thread"a.

Кем делается ? Тобой ?

>>Когда я повтроно соединяюсь то сервер не запускает ongetthread,

Это нормально.

>>а у клиента все ок, т.е. срабатывает onclientconnect без ошибок.

Ну так и слава богу !

>>Но сервер то молчит, никакой поток не запустил?

Он (сервер) его (код.поток) и не останавливал - просто убрал в кэш до востребования. При повторном коннекте как раз и наступит условие востребования уже стартовавшего ранее и готового теперь к обслуживанию нового коннекта код.потока.

Читай хэлп - см. св-во TServerSocket.ThreadCacheSize

А причем здесь OnGetSocket ? Это не имеет отношения к мультипоточности сервера.


 
neodiX   (2002-10-07 15:17) [17]

Eще раз спасибо, все получилось.


 
VID   (2002-10-08 16:31) [18]

to neodiX: я тебе на neodiX@mail.ru письмо отправил, посмотри пожалуйста.



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

Форум: "Сети";
Текущий архив: 2002.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
14-14777
Феликс
2002-11-12 22:06
2002.12.05
Создаем образ


7-14844
VIB
2002-10-01 13:32
2002.12.05
GetLastError() и FormatMessage()


14-14800
Cu
2002-11-15 11:26
2002.12.05
Система контроля версий объектов БД


1-14597
maxim2
2002-11-27 15:24
2002.12.05
Как обратится к объекту ?


1-14627
AndrewVolkov
2002-11-22 16:30
2002.12.05
keyPress -> CTRL, но не в onKeyPress и ему подобных???





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