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

Вниз

ServerSocket(stThreadBlocking) - как правильно отсоединится?   Найти похожие ветки 

 
neodiX ©   (2003-03-25 19:32) [0]

Всем привет!
Например есть такой код:
while (not Terminated) and ClientSocket.Connected do
begin
if SockStream.WaitForData(1000*60*60) then //one hour
begin
try
SetLength( s, 10*1024); //RequestBuf
LenReceived := SockStream.Read( s[1], Length(s));
. . .

так вот, когда сокет ждет данных (WaitForData), то, если в этот момент сделать serversocket1.active:=false; то выкидывает ерор.
Может надо поток убить, в котором сервер? Например, в эвенте ОnGetThread пишем:
procedure TScreenFromClient.ScreenServerGetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin
SocketThread := TServerThread.Create( false, ClientSocket);
end;

так мы имеем переменную типа TServerThread (созданный мной). И как теперь обратится к этой переменной чтоб убить поток, она же локальная? А мне надо ИМХО что то вроде такого:
SocketThread.terminate;

Поделитесь кто знает как правильно (чтоб никого еррора не выкидавало) вырубить сервак с подключеными клиентами?


 
Digitman ©   (2003-03-26 08:39) [1]

приведи свой полный код метода ClientExecute


 
Polevi ©   (2003-03-26 09:57) [2]

>она же локальная
сохраняй ссылки в списке

>SocketThread.terminate;
это тебе не поможет при твоем подходе, WaitForData усыпит поток и проверка
while (not Terminated) and ClientSocket.Connected do
не получит управления, если клиент не будет посылать данные



 
Digitman ©   (2003-03-26 10:40) [3]

достаточно закрыть гнездо из другого потока, чтобы "стронуть с места" WaitForData


 
Polevi ©   (2003-03-26 14:53) [4]

2Digitman © (26.03.03 10:40)
тогда и SocketThread.terminate не нужен -
and ClientSocket.Connected
отработает :-)


 
neodiX ©   (2003-03-26 15:31) [5]

2 Digitman:
>достаточно закрыть гнездо из другого потока, чтобы "стронуть с места" WaitForData
это как? с какого другого потока?

Полный код не могу, но всю суть пожалуйста:

Procedure TServerThread.ClientExecute;
var
ReplyBuf : string;
LenReceived : integer;

t:integer;
h,s:string;
begin
SockStream := TWinSocketStream.Create( ClientSocket, 60000);
Bmp:=Tbitmap.Create;
while (not Terminated) and ClientSocket.Connected do
begin
if SockStream.WaitForData(1000*60*60) then //one hour
begin
try
SetLength( s, 10*1024); //RequestBuf
LenReceived := SockStream.Read( s[1], Length(s));
if LenReceived > 0 then
begin
SetLength( s, LenReceived );
//сдесь происходит обработка полученных данных
end
else BREAK; // client has send zero data
except
BREAK; // stream read error, unexpected disconnect, ...
end;
end
else BREAK; // client did not send data within timeout limit
end;
SockStream.Free;
SockStream := nil;
ClientSocket.Close;
end;


 
Digitman ©   (2003-03-26 15:51) [6]

ну а теперь посмотри в текст метода WaitforData() - при каких условиях метод блокирует выполнение код.потока и при каких - возвращает управление (варианты - с возбуждением исключения или с нормальным возвратом результата)


и еще.
тело поточной ф-ции , если в нем могут возникать необработанные тобой искл-е ситуации, ВСЕГДА следует заключать в блок try..except/end, дабы не допустить выход исключения за пределы контекста код.потока

например, SockStream.Read() вполене может вызвать исключение, и в этом случае "граблями по лбу" тебе схлопотать 100%-но обеспечено)


 
neodiX ©   (2003-03-26 16:43) [7]

чего то я не догоняю :(
в методе WaitforData() ждется резуьтат функции select,а об возможных результатах этой функиции написано:

select returns the total number of descriptors which are ready and contained in the fd_set structures, zero if the time limit expired, or SOCKET_ERROR if an error occurred. If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.

Значит WaitforData() вернет правду только тогда, когда будет заполнена структура fd_set, т.е. когда будут приняты данные. Т.е. мне надо ждать какой то команды?

А может мне сделать таймаут меньше, а по его истечению не ВЫХОДИТЬ из цикла,а просто продолжать код, т.е. в моем случае выполнение перейдет на while not terminated ..... строку.

П.С. так я же тело поточной ф-ции заключил в блок try..except/end, или вы имели ввиду обработать ошибку?


 
Digitman ©   (2003-03-26 17:37) [8]

If the return value is SOCKET_ERROR, WSAGetLastError can be used to retrieve a specific error code.

тебе это о чем-то говорит ?


 
neodiX ©   (2003-03-26 17:53) [9]

уже говорит :)
спасибо.



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

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

Наверх




Память: 0.49 MB
Время: 0.011 c
3-83407
gary5555
2003-05-06 18:00
2003.05.26
Нумерация строк с помощью RecNo.


3-83413
Salvator
2003-05-05 09:20
2003.05.26
Нужна мат. модель БД


1-83597
V-A-V
2003-05-14 12:38
2003.05.26
Сохранение ветки реестра в файл


1-83498
tovSuhov
2003-05-15 11:36
2003.05.26
По поводу потоков...


3-83368
TankMan
2003-05-03 00:07
2003.05.26
Помогите с полем ID