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;
Может Гуру мне подскажут, что я делаю не так?