![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Определение отключения TSocket
panov © (2003-05-15 20:55:00)Реализую работу с Socket на низком уровне.
Не получается определить красиво разрыв(нормальное отсоединение) соединения.
Пришлось некрасивым способом, реализованным ниже, пользоваться.
WSAEventSelect(
fSocket,
fEvent,
FD_READ or FD_CLOSE);
FD_READ or FD_CLOSE потому, что одновременно проверять, есть ли входящие данные для обработки.
Есть ли стандартное решение?
procedure TThSC.Execute;
var
WaitResult: DWORD;
p: array[0..511] of Char;
i: Integer;
s: String;
begin
repeat
if WSAGetLastError<>0 then ShowMessage("??");
WSAEventSelect(
fSocket,
fEvent,
FD_READ or FD_CLOSE);
WaitResult := WaitForSingleObject(fEvent,1000);
if Terminated then Exit;
case WaitResult of
WAIT_OBJECT_0:
begin
fErr := Recv(fSocket,p,511,0);
if fErr>0 then
begin
p[fErr] := #0;
s := "";
for i := 0 to fErr-1 do
begin
if (p[i]=#13) then
begin
Disp("Received:"+s);
s := "";
continue;
end;
if (p[i]=#10) then continue;
s := s+ p[i];
end;
if s<>"" then Disp("Received:"+s);
end
else
begin
Disp("Closed");
Terminate;
break;
end;
WSAResetEvent(fEvent);
end;
WAIT_TIMEOUT:
begin
Disp("TimeOut");
end;
end;
until (WaitResult = WAIT_FAILED) or Terminated;
end;
Zelius (2003-05-16 11:57:00) [1]Способ вполне нормальный, APIшеый, только поменять WSA... на обычный select() (как в Indy сделано), что бы текст упростить, и после Recv проверять на ошибку:
case Recv(..) fo
SOCKET_ERROR: ...;
0: ..; // Connection closed gracefully
else
// данные получены
end;
panov (2003-05-16 11:12:00) [2]Спасибо, буду пробовать.
Digitman (2003-05-16 08:04:00) [3]WSAEventSelect() + WSAEnumNetworkEvents()