Home
Top.Mail.Ru Yandeks.Metrika
Forum: "Networks";
Current archive: 2002.12.05;
Download: [xml.tar.bz2];

Down

Socket & Thread, I can not understand what the problem is Find similar branches


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, т.е. как я понимаю мне его убивать не надо.
Если кто знает в чем проблема, помогите, at least ссылками на эту тему!



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 писать?
>>чо мне потом с этой переменой делать?

Ни<>чо. Можешь вообще ни cho не писать - никто не обязывает тебя вообще обрабатывать событие 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,

This is normal.

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

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

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

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

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

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



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

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



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

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



Pages: 1 whole branch

Forum: "Networks";
Current archive: 2002.12.05;
Download: [xml.tar.bz2];

Top









Memory: 0.62 MB
Time: 0.041 c
3-14358
bamston
2002-11-15 10:49
2002.12.05
DBGrid Columns


1-14504
lscomp
2002-11-23 19:20
2002.12.05
Помогите! Как получить количество строк в текстовом файле...


8-14689
Alex
2002-08-20 13:21
2002.12.05
MPeg


3-14468
BE
2002-11-19 05:37
2002.12.05
Help! Need advice on the bases. (do not kick plzzz).


1-14529
jen_bond
2002-11-26 16:40
2002.12.05
scrollbar to DBGRID





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 Español 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
English French German Italian Portuguese Russian Spanish