![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Блокирующие Сокеты: можно ли так делать... [D7, WinXP]
Makhanev A.S. © (2004-04-08 16:21:00)
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;
Правильно ли так поступать?
Мои тесты ошибок не показали.
Буду благодарен за ответы.
Если мои доводы непонятны, готов всё пояснить.
Makhanev A.S. (2004-04-08 18:45:00) [1]
> Verg © (08.04.04 17:38) [1]
большое спасибо за ответ.
всё понятно.
Verg (2004-04-08 17:38:00) [2]
> 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;
..........