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

Вниз

Блокирующие Сокеты: можно ли так делать...   Найти похожие ветки 

 
Makhanev A.S. ©   (2004-04-08 16:21) [0]

type
 TMyClientSocketThread = class(TThread)
 private
   FClient: TCustomWinSocket;
   SockStream: TWinSocketStream;
...

constructor TMyClientSocketThread.Create(ClientSocket: Pointer);
begin
 inherited Create(False);
 FClient := ClientSocket;
 SockStream := TWinSocketStream.Create(FClient, 20000);
end;

destructor TMyClientSocketThread.Destroy;
begin
 SockStream.Free;
 inherited;
end;

procedure TMyClientSocketThread.Execute;
...
 while (not Terminated) and (FClient.Connected) do
 begin
   if SockStream.WaitForData(ReplyTimeOut) then
   begin

    if FClient.ReceiveLength = 0 then
       Exit;
//??


При дисконнекте этого клиента по его же инициативе - я прсто выключаю этот thread.
При дисконнекте по инициативе сервера OnDisconnect на клиенте (TClientSocket, которому принадлежит FClient: TCustomWinSocket) не наступает.

Поэтому поток попадает в бесконечный цикл (FClient.Connected=True, WaitForData происходит мгновенно, получая в сокет 0 байт).

Поэтому я решил ввести условие:

    if FClient.ReceiveLength = 0 then
       Exit;


Правильно ли так поступать?
Мои тесты ошибок не показали.

Буду благодарен за ответы.
Если мои доводы непонятны, готов всё пояснить.


 
Verg ©   (2004-04-08 17:38) [1]


>  if SockStream.WaitForData(ReplyTimeOut) then
>    begin
>
>     if FClient.ReceiveLength = 0 then
>        Exit; //??


Да, так делать можно, конечно.
Можно даже проще

 if SockStream.WaitForData(ReplyTimeOut) then
 begin
   //После этого обязательно что-нибудь типа такого:
   res := SockStream.Read(....) // где res : integer;
   if res = 0 then // Результат Read в этой ситуции - признак разрыва соединения
     break;
..........


 
Makhanev A.S. ©   (2004-04-08 18:45) [2]


> Verg ©   (08.04.04 17:38) [1]

большое спасибо за ответ.
всё понятно.



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

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

Наверх




Память: 0.47 MB
Время: 0.046 c
3-1083826139
starik30
2004-05-06 10:48
2004.05.30
Хранримая процедура


1-1085036116
Loda
2004-05-20 10:55
2004.05.30
TAction


7-1082529809
ZDDR
2004-04-21 10:43
2004.05.30
иконка екзехи


14-1083752201
Vlad Oshin
2004-05-05 14:16
2004.05.30
Логические задачи в среду :)


9-1075136639
DewersiA
2004-01-26 20:03
2004.05.30
Помогите обработать множество изображений