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

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.008 c
3-83371
bss
2003-05-06 10:16
2003.05.26
Добавление заголовков на кнопки DBNavigatora


1-83521
$HiC0
2003-05-13 11:22
2003.05.26
2-х цветное изображение... получение, обработка


14-83670
Nick2000
2003-05-03 11:33
2003.05.26
Экзаменационное тестирование


4-83830
magister
2003-03-25 17:44
2003.05.26
Как рисовать поверх рабочего стола? (типа экранное меню)


6-83641
Zevsus
2003-03-24 23:22
2003.05.26
чтобы две программы слушали udp порт одновременно.





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