Текущий архив: 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.45 MB
Время: 0.041 c