Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 546

/ вопрос открыт /

Здравствуйте, эксперты! Мне поставлена задача написать приложение для приёма UDP пакетов размером 46 байт, считывать их согласно заданной структуре пакета и по извлечённым данным строить графики. Параметры могут занимать как несколько байт, так и несколько бит.
С подобным я ещё не сталкивался, поэтому у меня несколько вопросов.
С чего начать, какими компонентами пользоваться (работаю с Delphi7), ну и хотя бы кусок кода для ознакомления.

GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 26 июля 2014, 15:19
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 30; последнее сообщение — 27 июля 2014, 19:29; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2]

GAZ

GAZ (статус: Посетитель), 27 июля 2014, 17:43 [#21]:

Ну не знаю я в каком порядке что выполнять, какие настройки куда заносить, ново мне всё это, а с TIdUDPServer хоть примеры есть. И потом объясните мне в чём достоинства вашего кода. Ну допустим подключу я ваш модуль, мне всё равно нужен пример его использования считывания пакета по структуре.
GAZ

GAZ (статус: Посетитель), 27 июля 2014, 17:46 [#22]:

Сколько Вы пива за процедуру берёте?
min@y™

min@y™ (статус: Доктор наук), 27 июля 2014, 18:01 [#23]:

Цитата (GAZ):

объясните мне в чём достоинства вашего кода

Он работает.

Цитата (GAZ):

Ну допустим подключу я ваш модуль, мне всё равно нужен пример его использования

Пример (тут много лишнего):
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, uUDPSocket, Placemnt, XPMan, WinSock, ActnList, Menus;
 
type
  TSeparateMessage = packed record
                       Channel,
                       Nick,
                       Message: string;
                     end;
 
  TMainForm = class(TForm)
    ListView: TListView;
    XPManifest: TXPManifest;
    FormStorage: TFormStorage;
    PopupMenu: TPopupMenu;
    ActionList: TActionList;
    ClearAction: TAction;
    FontAction: TAction;
    FontDialog: TFontDialog;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    procedure ActionExecute(Sender: TObject);
  private
    procedure OnSocketReceive(Sender: TObject;
                              const FromIP: TInAddr;
                              const Message: string);
    function Decrypt(const Msg: string): string;
    function SeparateMessage(const S: string): TSeparateMessage;
    //procedure SaveListColumns(Columns: TListColumns; const RegKey: string);
  public
    FSocket: TUDPSocket;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;
 
var
  MainForm: TMainForm;
 
const
  //GSGPort = 8000; 
  GSGPort = 8167;
 
implementation
 
{$R *.dfm}
 
{ TMainForm }
 
{procedure TMainForm.SaveListColumns(Columns: TListColumns; const RegKey: string);
var
  Reg: TRegIniFile;
  Index: Integer;
begin
  Reg:= TRegIniFile.Create;
  try
    Reg.RootKey:= SettingsRoot;
    Reg.OpenKey(RegKey, True);
    for Index:= 0 to Columns.Count - 1 do
      Reg.WriteInteger('', 'Column' + IntToStr(Index), Columns[Index].Width);
  finally
    Reg.Free;
  end;
end; }
 
function TMainForm.Decrypt(const Msg: string): string;
const
  Password: string = 'xYmZЫ9';
var
  PasswordLengthDiv2: Integer;
  BI, PI: Integer;
  C: Char;
  MsgLength: Integer;
begin
  PasswordLengthDiv2 := Length(Password) div 2;
  MsgLength:= Length(Msg);
  PI := 1;
  BI := 1;
  SetLength(Result, MsgLength);
 
  while BI <= MsgLength do
    begin
      C := Msg[BI];
      C := Char(Byte(C) xor Byte(MsgLength));
      C := Char(Byte(C) - Byte(Password[PI]));
 
      Dec(C, PasswordLengthDiv2);
      Result[BI] := C;
      PI := PI + 1;
 
      if (PI > Length(Password))
        then PI := 1;
 
      BI := BI + 1;
    end;
end;
 
 
constructor TMainForm.Create(AOwner: TComponent);
begin
  inherited;
  FormStorage.IniFileName:= ChangeFileExt(Application.ExeName, '.ini');
  FSocket:= TUDPSocket.Create(GSGPort);
  FSocket.OnReceiveMessage:= OnSocketReceive;
  FSocket.Listen;
end;
 
destructor TMainForm.Destroy;
begin
  FSocket.Free;
  inherited;
end;
 
procedure TMainForm.OnSocketReceive(Sender: TObject;
                                    const FromIP: TInAddr;
                                    const Message: string);
var
  Item: TListItem;
  DcrMsg: string;
  SepMsg: TSeparateMessage;
begin
  DcrMsg:= Decrypt(Copy(Message, 7, Length(Message) - 6));
  SepMsg:= SeparateMessage(DcrMsg);
 
  if SepMsg.Channel = ''
    then Exit;
 
  if SepMsg.Channel[1] = '#'
    then begin
           Item:= ListView.Items.Add;
           with Item do
             begin
               Caption:= TimeToStr(Time);        // Время
               SubItems.Add(inet_ntoa(FromIP));  // IP-адрес
               SubItems.Add(SepMsg.Channel);     // Канал
               SubItems.Add(SepMsg.Nick);        // Ник
               SubItems.Add(SepMsg.Message);     // Сообщение
             end;
         end;
end;
 
procedure TMainForm.ActionExecute(Sender: TObject);
begin
  case TAction(Sender).Tag of
    0: ListView.Clear;// ClearAction
    1: begin // FontAction
         FontDialog.Font.Assign(ListView.Font);
         if FontDialog.Execute
           then ListView.Font.Assign(FontDialog.Font);
       end;
  end; //case
end;
 
function TMainForm.SeparateMessage(const S: string): TSeparateMessage;
var
  Temp: string;
  NextEnd: Integer;
begin
  Temp:= S;
 
  NextEnd:= Pos(#0, Temp);
  Result.Channel:= Copy(Temp, 2, NextEnd - 1);
  Delete(Temp, 1, NextEnd);
 
  NextEnd:= Pos(#0, Temp);
  Result.Nick:= Copy(Temp, 1, NextEnd - 1);
  Delete(Temp, 1, NextEnd);
 
  NextEnd:= Pos(#0, Temp);
  Result.Message:= Copy(Temp, 1, NextEnd - 1);
end;
 
end.

Здесь просто слушается определённый порт, пролетающая датаграмма ловится и выводится на экран.

Цитата (GAZ):

по структуре

По какой такой структуре?

Цитата (GAZ):

Сколько Вы пива за процедуру берёте?

Я беру плату только за работу. Копипаст своих исходников в интернет - бесценно!!! :) Для остального есть мастеркард.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

min@y™ (статус: Доктор наук), 27 июля 2014, 18:03 [#24]:

Давай до завтра отложим всё это, я на работу приду, ты мне шумни, я тебе всё покажу.
Мне щас неудобно набирать текст, я на диване валяюсь и телек смотрю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
GAZ

GAZ (статус: Посетитель), 27 июля 2014, 18:23 [#25]:

Насчёт структуры. Длина пакета 46 байт, до 40 байта в пакете зашиты функциональные параметры от 2 до 4 байт, после 40 байта контактные параметры по 1 биту, есть и пустые байты для резерва.
min@y™

min@y™ (статус: Доктор наук), 27 июля 2014, 18:36 [#26]:

Цитата (GAZ):

Насчёт структуры. Длина пакета 46 байт, до 40 байта в пакете зашиты функциональные параметры от 2 до 4 байт, после 40 байта контактные параметры по 1 биту, есть и пустые байты для резерва.

Когда ж до тебя, тугодума, дойдёт, что расшифровка данных из принятых пакетов не имеет ничего общего с передачей этих пакетов по сети???!!!!111 Тема расшифровки, если у тебя с ней проблемы, заслуживает создания отдельного вопроса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
GAZ

GAZ (статус: Посетитель), 27 июля 2014, 18:58 [#27]:

Я про передачу и слова не говорил, меня волнует вопрос их получения (чтения) или весь пакет в буфер и далее его дербанить или сразу в переменные,как быстрее, биты тогда напрягают
min@y™

min@y™ (статус: Доктор наук), 27 июля 2014, 19:08 [#28]:

Цитата (GAZ):

пакет в буфер и далее его дербанить

Создай новый вопрос. Опиши структуру пакета. И приложи примеры реальных пакетов (несколько штук). Далее - подробно опиши, что у тебя не получается.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
GAZ

GAZ (статус: Посетитель), 27 июля 2014, 19:27 [#29]:

Ок, завтра возьму его структуру с работы и выложу, однако мне не понятно в событии какого компонента и каким методом считывать этот пакет у всех описание событий и методов разное.
min@y™

min@y™ (статус: Доктор наук), 27 июля 2014, 19:29 [#30]:

Цитата (GAZ):

мне не понятно в событии какого компонента и каким методом считывать этот пакет у всех описание событий и методов разное.

Завтра покажу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 02:59
Выполнено за 0.03 сек.