Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.024 c
9-1074687325
SoulSilver
2004-01-21 15:15
2004.05.30
Help с Сетевой Игрой. Chat с помощью DXPlay


1-1084941881
Calm
2004-05-19 08:44
2004.05.30
Как в FastReport в run-time создать лист с картинкой?


11-1074200421
Neep
2004-01-16 00:00
2004.05.30
Создание меню без MCK


3-1083104408
Chechen
2004-04-28 02:20
2004.05.30
SQL запрос


14-1084191871
X9
2004-05-10 16:24
2004.05.30
COM-port




   Наверх