Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2015, 19:38   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Интересно обходиться без готовых решений и компонентов. Да и вроде всё сетевое взаимодействие на них построено? не?
Ну в целом да. Если это академическая задача.
Сокеты говоришь хочешь? Их есть у меня: fpsocket - классы для связи сокетами. Unit1 - сам удаленный управленец. И учти - его скорость работы потрясает своей тормознутостью

P.S. Ладно... Проехали. Берите код кто хотите... Все равно он не круче РАдмина.
Вложения
Тип файла: txt unit1.txt (12.5 Кб, 158 просмотров)
Тип файла: txt fpsockets.txt (7.9 Кб, 154 просмотров)
I'm learning to live...

Последний раз редактировалось Stilet; 15.10.2015 в 19:14.
Stilet вне форума Ответить с цитированием
Старый 14.10.2015, 20:30   #12
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Спасибо Кстати совет на счет размера данных в пакете помог, скрин принялся, иногда вылетает AV но думаю справлюсь)
Моя разработка сугубо для самосовершенствования, ну и просто интерес. Скину своей бывшей информатичке на почту когда закончу) тройки мне ставила "Ты можешь лучше!"
Здравствуйте

Последний раз редактировалось NEoMASTERR; 14.10.2015 в 20:33.
NEoMASTERR вне форума Ответить с цитированием
Старый 14.10.2015, 21:06   #13
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Нет я не справился. Почему то вылетает AV на втором пакете.
Сервер отправляет правильно всё, клиент странно принимает. Вместо 10236 приходит 18000+, но, стоит прицепить к процессу wpepro как всё налаживается, чё ему надо?)

Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 14.10.2015, 21:12   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну так поставь бряк и посмотри какие переменные в nil указывают )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.10.2015, 21:49   #15
NEoMASTERR
Форумчанин
 
Аватар для NEoMASTERR
 
Регистрация: 22.12.2010
Сообщений: 175
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну так поставь бряк и посмотри какие переменные в nil указывают )
Поставил 3 бряка в 3х местах, сервер все делает правильно
но клиент выпендривается
1 байт - сигнатура передачи скрина, следующие 2 байта - размер данных
и вот почему то этот размер иногда равен 18260, хотя сервер послал наверняка не 18260, потому что там тоже логи, стоит подключить wpepro как ошибка пропадает, я час почти смотрел на работу приложения, вырубил wpepro, перезапустил клиент, 2 пакет пришёл - эррор, потому что 18260 > размера буфера
Здравствуйте
NEoMASTERR вне форума Ответить с цитированием
Старый 15.10.2015, 08:46   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
стоит подключить wpepro как ошибка пропадает
Ну он перехватывает ошибки видимо.
Выясняй что сервер отправляет. Что-то видимо совсем не то.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.12.2015, 09:33   #17
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

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

Либо самому делать свой определенный заголовок указывать в нем тип заголовка и размер, затем все это проверять в приеме как я уже выше написал, иначе можно завалить ваш прием левыми пакетами, либо будут ошибки, либо картинка кривая

к примеру в вашем клиенте
Код:
Const
CM_IDENT = $DEADBEEF;
CM_MSGPIC = $2345;
CM_MSGINFO = $3245;

// Заголовок пакета который нужно ловить
Type
  PGHeader = ^TGHeader;
  TGHeader = record
  Ident: DWORD; //Свой идентификатор
  Types: DWORD; //определяем тип пакета картинка или служебная инфа
  Size: DWORD; // Размер пакета
end;
...........................


//Доработка вашего кода приема
var
 GHeader: TGHeader ;
Pos: Integer;
FindPaket: boolean;
............................

PEPPA_SCREENF:
          begin
            log('END Received '+inttostr(bytes_recv)+' bytes');   
           pic.Write(buff[1],bytes_recv);

//Делаем проверку что пакет наш
if pic.size >= SizeOf(TGHeader) then
begin
Pos:= 0;
FindPaket:= false;
// читаем пакет по байтам
While pos >= pic.size do
begin
pic.Position:= pos;
 pic.read(GHeader, SizeOf(TGHeader));
if (GHeader.Ident = CM_IDENT)and
(GHeader.Types = CM_MSGPIC)and
(GHeader.Size <= Pic.size) then
begin
FindPaket:= true;
break;
end;
Inc(pos);
///application.ProcessMessages; // если работа не в потоке
///sleep(1); //если работа в потоке 
end;


// Если наш пакет найден то работаем уже с полноценным пакетом
if FindPaket and
(GHeader.Ident = CM_IDENT)and
(GHeader.Size <= Pic.size) then
 begin
if (GHeader.Types = CM_MSGPIC) then
begin
            pic.Position:= Pos + SizeOf(TGHeader);
            jpg:=TJPEGImage.Create;
            jpg.LoadFromStream(pic);
            jpg.SaveToFile(ExtractFilePath(Application.ExeName)+'received_full.jpg');

            Form1.img1.Picture.Bitmap.Assign(jpg);
            jpg.Free;
end;
if (GHeader.Types = CM_MSGINFO) then
begin
// что то делаем с другой инфой если такой пакет есть, но можно и не делать, это для примера ловли другой тип пакета
end;
pic.Clear;
end;
end;
// для предотвращения перегруза памяти чистим stream принятых пакетов
if pic.size > 65535 then
pic.clear;

Последний раз редактировалось Aliens_wolfs; 05.12.2015 в 13:16.
Aliens_wolfs вне форума Ответить с цитированием
Старый 05.12.2015, 13:15   #18
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

а в сервере собираете пакет с таким же заголовком и отправляете, я думаю разберетесь

Код:
//работа сервера

procedure TForm1.OnTimerScreen(Sender: TObject);
begin
//Отправление пакета по таймеру если нужно
SendPaketScreen(hSocket);
end;

//Функция для определения палитры системы
function GetSystemPalette : HPalette;
var
 PaletteSize  : integer;
 LogSize      : integer;
 LogPalette   : PLogPalette;
 DC           : HDC;
 Focus        : HWND;
begin
 result:=0;
 Focus:=GetFocus;
 DC:=GetDC(Focus);
 try
   PaletteSize:=GetDeviceCaps(DC, SIZEPALETTE);
   LogSize:=SizeOf(TLogPalette)+(PaletteSize-1)*SizeOf(TPaletteEntry);
   GetMem(LogPalette, LogSize);
   try
     with LogPalette^ do
     begin
       palVersion:=$0300;
       palNumEntries:=PaletteSize;
       GetSystemPaletteEntries(DC, 0, PaletteSize, palPalEntry);
     end;
     result:=CreatePalette(LogPalette^);
   finally
     FreeMem(LogPalette, LogSize);
   end;
 finally
   ReleaseDC(Focus, DC);
 end;
end;

//функция для снятия скрина с рабочего стола в JPEG
procedure CaptureScreen(AWidth, AHeight: integer; JPG: TJPEGImage);
var
 ScreenDC : HDC;
 BMP: TBitmap;
begin
 BMP:= TBitmap.Create;
 with BMP do
 begin
  Width:= AWidth;
  Height:= AHeight;
  ScreenDC:=GetDC(0);
  try
    StretchBlt(Canvas.Handle, 0, 0, Width, Height, ScreenDC, 0, 0,
    Screen.Width, Screen.Height, SRCCOPY);
  finally
    ReleaseDC(0, ScreenDC);
  end;
  Palette:=GetSystemPalette; // задаем палитру системы
  JPG.Assign(BMP);
  Free;
 end;
end;

// Функция для отправки пакета лучше сделайте в потоке
Procedure SendPaketScreen(hSocket: integer);
var
 GHeader: TGHeader ;
SendMem, Mem: TMemoryStream;
begin
  Mem:= TMemoryStream.create;
  SendMem:= TMemoryStream.create;
  jpg:=TJPEGImage.Create;
try
 CaptureScreen(640, 480, jpg); //картинка будет размерами такой какой укажите
 jpg.SaveToStream(mem);
 GHeader.Ident:= CM_IDENT;
 GHeader.Typs:= CM_MSGPIC;
 GHeader.Size:= Mem.size;
 SendMem.write(GHeader, SizeOf(TGHeader)); // записываем заголовок в пакет отправления
 mem.position:= 0;
 SendMem.write(Mem.Memory^, Mem.Size); // записываем данные картинки в пакет отправления
 SendMem.position:= 0;
 WinSock.sendTo(hSocket, SendMem.Memory^, SendMem.Size, 0); // отправляем пакет
finally
   Mem.free;
   SendMem.free;
   jpg.free;
end;
end;
Накидал пример на скорую руку может кому что и пригодиться

Последний раз редактировалось Aliens_wolfs; 05.12.2015 в 13:50.
Aliens_wolfs вне форума Ответить с цитированием
Старый 22.02.2016, 00:31   #19
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию

Ох какие люди, сколько лет, сколько зим, Aliens_wolfs ))

NEoMASTERR Советую прислушаться к Aliens_wolfs эксперту в этих делах !
fucil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Jpeg warmbabe Общие вопросы по Java, Java SE, Kotlin 2 26.02.2010 20:14
Работа с JPEG Artruman Мультимедиа в Delphi 2 04.05.2009 15:13
jpeg.dcu Lemo Общие вопросы Delphi 14 31.12.2008 18:19
Jpeg Артэс Win Api 1 29.11.2008 08:48
jpeg All517 БД в Delphi 15 22.11.2007 14:31