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

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



Память: 0.45 MB
Время: 0.011 c
1-67759
BelCaesar
2003-07-08 19:44
2003.07.21
С канвы на принтер или в bmp файл!


3-67677
seregin
2003-06-26 14:34
2003.07.21
IB/FB - Запрос по подзапросу с группировкой


14-67971
race1
2003-07-07 09:02
2003.07.21
php & global var


14-68013
Фикус
2003-07-04 08:16
2003.07.21
Интересно, а кто был 20000000 посетителем? :)


14-67995
Кен
2003-06-29 05:45
2003.07.21
Как проще всего преобразовать программу в компонент ?




   Наверх