Delphi 11 + Indy10 - авторизации на VNC сервере

Скажу сразу - с Indy и VNC особо не работал, просто встала задача подключится и сделать скриншот с сервера по VNC. Серверов много, поэтому пишется отдельная часть внутреннего софта.

На просторах интернета есть пример для D7 и Indy9 - delphivnc-0.1, он отлично работает, если компилировать его,например, в Delphi 7. Но в Д11 версия Инди уже 10 и мне не удалось переписать его, почему то рвется соединение.. вот условный пример для Д7 и Инди 9, которые прекрасно работает:

  idVnc.Connect(10000);
  idVnc.ReadLn(#10); // считываем версию протокола
  buff := PChar(ProtocolVersion + #10);
  idVnc.WriteBuffer(buff^, StrLen(buff), TRUE); // отправляем версию протокола
  AuthenticationSheme := idVnc.ReadInteger; // Получаем схему идентификации
  case AuthenticationSheme of
    2: begin
       Challenge := idVnc.ReadString(CHALLENGESIZE);
       Response := vncEncrypt(Challenge, APass);
       idVnc.WriteBuffer(Response[1], Length(Response), TRUE);
       Status := idVnc.ReadInteger;
       case Status of
         0 : { OK } Result := 2;
         1 : { failed } Result := 1;
         2 : { too many } Result := 0;
       end;
    end;
  end;

Вот код, который получился у меня и он не работает:

  idVnc := TIdTCPClient.Create(Nil);
  try
    idVnc.Port := 5900;
    idVnc.Host := FIP;
    idVnc.Connect;
    if idVnc.Connected then begin
      Response := idVnc.Socket.ReadLn();
      idVnc.Socket.WriteLn(ProtocolVersion + #10);
      AuthenticationSheme := idVnc.Socket.ReadInt32();
      case AuthenticationSheme of
        2: begin
           Challenge := idVnc.Socket.ReadString(16);
           Response := vncEncrypt(Challenge, APass);
           // buffer - это TidBytes
           SetLength(buffer, 16);
           CopyMemory(buffer, @Response[1], 16);
           // после этой строчки рвется соединение
           // Причем я пробовал по всякому и WriteLn и другие
           idVnc.Socket.WriteDirect(buffer)
           // До сюда не доходит, вернее на это строке появляется ошибка - connection reset by peer
           Status := idVnc.Socket.ReadInt32();
           case Status of
             0 : Result := 2;
             1 :  Result := 1;
             2 : Result := 3;
           end;
        end;
      end;
      idVnc.Disconnect;
    end;
  finally
    idVnc.Free;
  end;

Может Гуру мне подскажут, что я делаю не так?


Ответы (0 шт):