Главная страница
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.047 c
14-1084259673
vidiv
2004-05-11 11:14
2004.05.30
AT команды телефона LG G5300


14-1084441323
TUser
2004-05-13 13:42
2004.05.30
AutoCAD?


11-1072086191
Tenac
2003-12-22 12:43
2004.05.30
Что будет после KOL? И как сново сделать все как было


14-1083921184
fag2000
2004-05-07 13:13
2004.05.30
Как дождаться завершения выполнения команды?


1-1084679725
IrBisoff
2004-05-16 07:55
2004.05.30
Always OnTop для второй формы в приложении.