Главная страница
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.028 c
6-1081854524
Steelator
2004-04-13 15:08
2004.05.30
Какой лучше использовать Stream для работы с TIdTCPServer/Client


1-1084700689
killer
2004-05-16 13:44
2004.05.30
Форма


1-1084893531
Sonic_gd
2004-05-18 19:18
2004.05.30
Сворачивание в трей


14-1084374073
konstantinov
2004-05-12 19:01
2004.05.30
Создание скомпилированных HTML файлов


4-1082381434
S_S_S
2004-04-19 17:30
2004.05.30
Как переместить системные кнопки управления окном