Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.21;
Скачать: CL | DM;

Вниз

Определение отключения TSocket   Найти похожие ветки 

 
panov ©   (2003-05-15 20:55) [0]

Реализую работу с 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;


 
Digitman ©   (2003-05-16 08:04) [1]

WSAEventSelect() + WSAEnumNetworkEvents()


 
panov ©   (2003-05-16 11:12) [2]

Спасибо, буду пробовать.


 
Zelius ©   (2003-05-16 11:57) [3]

Способ вполне нормальный, APIшеый, только поменять WSA... на обычный select() (как в Indy сделано), что бы текст упростить, и после Recv проверять на ошибку:
case Recv(..) fo
SOCKET_ERROR: ...;
0: ..; // Connection closed gracefully
else
// данные получены
end;



Страницы: 1 вся ветка

Текущий архив: 2003.07.21;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
1-67846
Kiril
2003-07-07 19:59
2003.07.21
Как добавлять в программу уже готовые


14-68062
Карлсон
2003-07-04 23:50
2003.07.21
давайте шварцами меряться!


1-67903
Alexdream
2003-07-08 14:22
2003.07.21
Delphi Source


7-68103
SPeller
2003-05-11 14:24
2003.07.21
Создание отдельной нити, но не простой...


3-67687
sergt
2003-06-26 16:12
2003.07.21
перегонка данных с таблицы Oracle в dbf