Конференция "Сети" » скриншот и UDP [D7, WinXP]
 
  • olchick © (02.06.09 23:15) [0]
    Здраствуйте, уважаемые форумчани.

    Написала программульку которая делает на удаленной машине скриншот и передает его на мой. Но есть две проблемы:

    1. При отображении изображения в image32 происходит какаето ерунда - такое ощущение, что по сети передается не одно изображение, а целая куча, причем с каждым разом все меньше и меньше их параметры(ширина и высота). В итоге в image32 сразу видно несколько, отличных по размеру, копий изображения.

    2. Вторая проблема заключается в том, что не могу передать копию удаленного экрана во всем размере ,хотя и кодирую его в jpg. Приходиться передавать уменьшенную копию, к примеру 500 на 500. Можно и побольше, но качество надо уменьшить. Если передаю во весь размер Delphi выдает ошибку - переполнения буфера.

    В работе использую компоненты indy для работы с udp.
    Помогите разобраться...

    Может быть непонятно объяснила проблемы - поэтому прикрепляю два файла. Когда протестируете все увидите сами...

    Заранее спасибо...
  • FireMan_Alexey © (03.06.09 01:34) [1]
    1. Выкинь UDP, а пользуй TCP
    2. Прикрепленных файлов лично я не увидел :)
    Твоя проблема состоит в том, что UDP: вопервых не гарантирует доставку; вовторых имеет ограничение по размеру кадра чуть меньше 64Кб.
    Если даже будешь разбивать изображение на части то UDP не гарантирует, что посланная тобой последовательность придет в том же порядке как и посылалась!

    Решение твоей задачи:

    Первое
    1. Используй TCP и будет Вам щастье :)

    Второе
    1. Не морочь голову поставь RAdmin :)

    Если же выберешь первое решение, то есть компоненты T(Server/Client)Socket в [Delphi]\Source\VCL\SCKTCOMP.PAS
    ну или ИНДИ :)
    Смотря какая стоит задача.
    Можно и на Winsock-е написать :)
  • FireMan_Alexey © (03.06.09 01:36) [2]
    Оффтоп: Вы часом с ikot-ом не родственники? :)
  • Dennis I. Komarov © (03.06.09 10:04) [3]

    > Написала программульку которая делает на удаленной машине
    > скриншот и передает его на мой. Но есть две проблемы:

    Стянула код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому есть две проблемы:

    > 1. При отображении изображения в image32 происходит какаето
    > ерунда - такое ощущение, что по сети передается не одно
    > изображение, а целая куча, причем с каждым разом все меньше
    > и меньше их параметры(ширина и высота). В итоге в image32
    > сразу видно несколько, отличных по размеру, копий изображения.
    >

    Скорее всего передаются только изменившиеся куски скрина

    > 2. Вторая проблема заключается в том, что не могу передать
    > копию удаленного экрана во всем размере ,хотя и кодирую
    > его в jpg. Приходиться передавать уменьшенную копию, к примеру
    > 500 на 500. Можно и побольше, но качество надо уменьшить.
    >  Если передаю во весь размер Delphi выдает ошибку - переполнения
    > буфера.

    У дельфи очень маленький буфер, туда целый экран не влезет ;)

    > Может быть непонятно объяснила проблемы - поэтому прикрепляю
    > два файла. Когда протестируете все увидите сами...

    Хм... тут совсем интересно. И куда их прикрепила? )))
  • olchick © (03.06.09 11:32) [4]

    > Оффтоп: Вы часом с ikot-ом не родственники? :)


    C чего ты это взял. Если судить по  твоим словам, то на этом форуме почти все являются родственниками..
    Большая у нас тогда получается семья.
  • olchick © (03.06.09 11:39) [5]

    > > Написала программульку которая делает на удаленной машине
    > > скриншот и передает его на мой. Но есть две проблемы:Стянула
    > код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому
    > есть две проблемы:> 1. При отображении изображения в image32
    > происходит какаето > ерунда - такое ощущение, что по сети
    > передается не одно > изображение, а целая куча, причем с
    > каждым разом все меньше > и меньше их параметры(ширина и
    > высота). В итоге в image32 > сразу видно несколько, отличных
    > по размеру, копий изображения.> Скорее всего передаются
    > только изменившиеся куски скрина> 2. Вторая проблема заключается
    > в том, что не могу передать > копию удаленного экрана во
    > всем размере ,хотя и кодирую > его в jpg. Приходиться передавать
    > уменьшенную копию, к примеру > 500 на 500. Можно и побольше,
    >  но качество надо уменьшить.>  Если передаю во весь размер
    > Delphi выдает ошибку - переполнения > буфера. У дельфи очень
    > маленький буфер, туда целый экран не влезет ;)> Может быть
    > непонятно объяснила проблемы - поэтому прикрепляю > два
    > файла. Когда протестируете все увидите сами...Хм... тут
    > совсем интересно. И куда их прикрепила? )))


    Зачем грубить.
    Вообще то форумы для того и служат, чтобы спросить совета.

    RADMIN - это хорошо, но хочеться и самой  попробовать создать что-то подобное.

    На щет исходников - дело в том, что аналогичное сообщение оставила и на другом форуме. Как здесь прикреплять файлы не знаю, поэтому выставляю исходники в письменном виде.
    Смотри сообщение ниже:
  • olchick © (03.06.09 11:40) [6]
    Это сервер

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, ScktComp,  Jpeg, ExtCtrls, IdBaseComponent,
     IdComponent, IdUDPBase, IdUDPClient;

    type
     TForm1 = class(TForm)
       ServerSocket1: TServerSocket;
       IdUDPClient1: TIdUDPClient;
       procedure FormCreate(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure ServerSocket1ClientRead(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ServerSocket1ClientConnect(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ServerSocket1ClientDisconnect(Sender: TObject;
         Socket: TCustomWinSocket);
     private
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure ScreenShot;
     var
       bmp: TBitmap;
       DC: HDC;
       Canvas: TCanvas;
       MemStream  : TMemoryStream;
       jpg: TJpegImage;

     begin
       DC := GetDC(0);
       Bmp := TBitmap.Create;
       Bmp.PixelFormat:=pf16bit;
       Bmp.Width := Screen.Width;
       Bmp.Height := Screen.Height;

       Canvas := TCanvas.Create;
       Canvas.Handle := DC;

       Bmp.Canvas.CopyRect(Screen.DesktopRect, Canvas, Screen.DesktopRect);

       jpg := TJpegImage.Create;
       jpg.Assign( bmp );

       bmp.Width := 500 ;
       bmp.Height:= 500;
       bmp.Canvas.StretchDraw( bmp.Canvas.Cliprect, jpg );

       jpg.Assign( bmp );
       jpg.CompressionQuality:=45;

       MemStream:= TMemoryStream.Create;

       jpg.SaveToStream(MemStream);

       form1.idUDPClient1.SendBuffer(MemStream.Memory^,MemStream.Size);

          MemStream.Free;
          jpg.Free;
          bmp.Free;
          Canvas.Free;
       end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    serverSocket1.Active:=true;

    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    ServerSocket1.Active:=false;

    end;

    procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
     Socket: TCustomWinSocket);
    var reseiveText, reseiveText1, cmd:string;  lockin:boolean;
     begin

     reseiveText:=Socket.ReceiveText;
     reseiveText1:=reseiveText;

     if length(reseiveText)<=6 then
            cmd:=reseiveText else
     begin
            reseiveText:=copy(reseiveText, 8, length(reseiveText));
            cmd:=copy(reseiveText1, 1, 6);
     end;

      if cmd = 'screen' then ScreenShot;

     end;

    procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
    form1.Caption:='Connected...';
    form1.IdUDPClient1.Port:=4001;
    form1.IdUDPClient1.Host:=Socket.RemoteHost;
    form1.IdUDPClient1.Active:=true;
    end;

    procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
    form1.Caption:='Disconnect...';
    end;

    end.
  • olchick © (03.06.09 11:40) [7]
    Это клиент

    unit Unit1;

    interface

    uses
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, ExtCtrls, ScktComp,jpeg, Buttons, IdBaseComponent,
     IdComponent, IdUDPBase, IdUDPServer, IdSocketHandle, unit3;

    type
     TForm1 = class(TForm)
       ClientSocket1: TClientSocket;
       Label1: TLabel;
       Label2: TLabel;
       port: TEdit;
       ip: TEdit;
       Button1: TButton;
       Button2: TButton;
       BitBtn8: TBitBtn;
       IdUDPServer1: TIdUDPServer;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure FormDestroy(Sender: TObject);
       procedure ClientSocket1Connect(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure ClientSocket1Disconnect(Sender: TObject;
         Socket: TCustomWinSocket);
       procedure Button3Click(Sender: TObject);
       procedure BitBtn8Click(Sender: TObject);
       procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
         ABinding: TIdSocketHandle);
     private

       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;
     MemoryStream  : TMemoryStream;

    implementation

    {$R *.dfm}

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ClientSocket1.Port:=strtoint(port.Text);
    ClientSocket1.Address:=ip.Text;
    ClientSocket1.Active:=true;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
    ClientSocket1.Active:=false;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    ClientSocket1.Close;
    ClientSocket1.Active:=false;
    end;

    procedure TForm1.ClientSocket1Connect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
    form1.Caption:='Connected!';
    end;

    procedure TForm1.ClientSocket1Disconnect(Sender: TObject;
     Socket: TCustomWinSocket);
    begin
    form1.Caption:='Disconnect';
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
      ClientSocket1.Socket.SendText('screen');
    end;

    procedure TForm1.BitBtn8Click(Sender: TObject);
    begin
    ClientSocket1.Socket.SendText('screen');
    form3.show;
    end;

    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
     ABinding: TIdSocketHandle);
     begin
      MemoryStream:= TMemoryStream.Create;
      MemoryStream.CopyFrom(AData, AData.Size);
      MemoryStream.SaveToFile('C:\logo.jpg');
      form3.Image321.Bitmap.LoadFromFile('C:\logo.jpg');
      if form3.Showing
      then
         begin
           MemoryStream.Free;
           ClientSocket1.Socket.SendText('screen');
         end;
      end;
    end.
  • Dennis I. Komarov © (03.06.09 13:10) [8]

    > olchick ©   (03.06.09 11:39) [5]
    > Зачем грубить.

    Увольтес, где???
  • olchick © (03.06.09 13:31) [9]

    Но есть две проблемы:
    Стянула код неизвестно откуда и ес-но в нем ничего не понимаю, поэтому
    > есть две проблемы: 1. При отображении изображения в image32
    > происходит какаето > ерунда - такое ощущение, что по сети
    > передается не одно > изображение, а целая куча, причем с
    > каждым разом все меньше > и меньше их параметры(ширина и
    > высота). В итоге в image32 > сразу видно несколько, отличных
    > по размеру, копий изображения.> Скорее всего передаются
    > только изменившиеся куски скрина> 2. Вторая проблема заключается
    > в том, что не могу передать > копию удаленного экрана во
    > всем размере ,хотя и кодирую > его в jpg. Приходиться передавать
    > уменьшенную копию, к примеру > 500 на 500. Можно и побольше,
    >  но качество надо уменьшить.>  Если передаю во весь размер
    > Delphi выдает ошибку - переполнения > буфера. У дельфи очень
    > маленький буфер, туда целый экран не влезет ;)> Может быть
    > непонятно объяснила проблемы - поэтому прикрепляю > два
    > файла. Когда протестируете все увидите сами...Хм... тут
    > совсем интересно. И куда их прикрепила? )))


    Вы тоже удовольтесь и прочитайте сами свои слова
  • Dennis I. Komarov © (03.06.09 13:43) [10]

    > Вы тоже удовольтесь и прочитайте сами свои слова

    И где тут груботсь? Изволите утверждать что он самолично написан?
  • olchick © (03.06.09 14:02) [11]

    > И где тут груботсь? Изволите утверждать что он самолично
    > написан?

    никто не говорит об этом, а если Вы не понимаете о чем кокретно иде речь, то прошу Вас обратить внимание на эту фразу:
    ес-но в нем ничего не понимаю

    Ладно, проехали...
  • Dennis I. Komarov © (03.06.09 14:21) [12]

    > Ладно, проехали...

    Проехали, так проехали...

    1. Зачем серверу форма?
  • FireMan_Alexey © (03.06.09 14:27) [13]
    >olchick ©
    Судя по исходнику, это полный бред!
    Зачем ты создаешь ClientSocket и ServerSocket если все равно посылаеш через UDP!?!?!?!?!?!?!

    Да этот форум отличается тем, чтобы давать направление куда копать!

    http://book.itep.ru -там найдешь описание UDP и TCP!

    твоя задача:
    1. Создать "Запись" типа:
     Индентификатор+Команда+РазмерПередаваемыхДанных;
    2. Сервер обрабатыевает команду и отсылает ответ на клиент.
    3. TCP - это потоковый протокол, данные надо складывать в буфер, UDP - диаграммный протокол, и тебе он не подходит!
    4. Выкинь свой исходник и начни изучать как устроены протоколы передачи данных, чтобы не задавать вопросов, почему у меня вышеописанный бред не работает.
  • Dennis I. Komarov © (03.06.09 14:35) [14]

    > Зачем ты создаешь ClientSocket и ServerSocket если все равно
    > посылаеш через UDP!?!?!?!?!?!?!

    А через него она передает адрес клиента, на этом его миссия заканчивается...
  • oollyy (03.06.09 14:36) [15]
    Всем БОЛЬШОЕ СПАСИБО за помощь ...
  • olchick © (03.06.09 14:43) [16]
    Было приятно советоваться с вами - дЖЕНТЕЛЬМЕНЫ
  • FireMan_Alexey © (03.06.09 14:43) [17]
    >olchick ©

    А как ты проверяешь, послала ли ты данные или нет?
    У тебя нет обработки ошибок!

    Чтобы ты поняла опишу технологию, как должна была бы выглядеть твоя программа:

    1. Программа на удаленном ПК открывает УДП порт к примеру 8888 и слушает когда придет пакет от сервера.
    2. Ты запуская свою программу администрирования отсылаешь Броадкаст пакет(можно раз в 15 сек) с данными своего (ДНС-Имени или IP-адрес)+Порт на свой ТСП сервер.
    3. Клиент принимая пакет пытается соединится с твоим сервером. А далее ты создаешь список клиентов и далее уже отсылаеш и принимаеш данные по ТСП протоколу. А там нужно отделять одно сообщение(изображение) пакет от другого.
    4. Дальше делаеш с данными все что тебе заблагорассудиться...

    А передача команд строковыми переменными, большая расточительность. ИМХО!
  • Dennis I. Komarov © (03.06.09 14:53) [18]
    [15] Вот, :( обиделась.... потом через 7 минут зашла [16]  - ничего нет... и опять обиделась...
  • FireMan_Alexey © (03.06.09 15:10) [19]
    ну чего обижаться...
    Мы же объясняли, что не тот протокол...
    Или девушка ждала исходный программы ее мечты?
    пускай напишет, что она хотела...
 
Конференция "Сети" » скриншот и UDP [D7, WinXP]
Есть новые Нет новых   [134435   +19][b:0][p:0.001]