Форум: "Сети";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
ВнизОпределение отключения 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;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.006 c