|
Вопрос # 6 546/ вопрос открыт / |
|
Здравствуйте, эксперты! Мне поставлена задача написать приложение для приёма UDP пакетов размером 46 байт, считывать их согласно заданной структуре пакета и по извлечённым данным строить графики. Параметры могут занимать как несколько байт, так и несколько бит.
С подобным я ещё не сталкивался, поэтому у меня несколько вопросов.
С чего начать, какими компонентами пользоваться (работаю с Delphi7), ну и хотя бы кусок кода для ознакомления.
 |
Вопрос задал: GAZ (статус: Посетитель)
Вопрос отправлен: 26 июля 2014, 15:19
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 30; последнее сообщение — 27 июля 2014, 19:29; участников в обсуждении: 3.
Страницы: [« Предыдущая] [1] [2]
|
GAZ (статус: Посетитель), 27 июля 2014, 17:43 [#21]:
Ну не знаю я в каком порядке что выполнять, какие настройки куда заносить, ново мне всё это, а с TIdUDPServer хоть примеры есть. И потом объясните мне в чём достоинства вашего кода. Ну допустим подключу я ваш модуль, мне всё равно нужен пример его использования считывания пакета по структуре.
|
|
GAZ (статус: Посетитель), 27 июля 2014, 17:46 [#22]:
Сколько Вы пива за процедуру берёте?
|
|
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™ (статус: Доктор наук), 27 июля 2014, 18:03 [#24]:
Давай до завтра отложим всё это, я на работу приду, ты мне шумни, я тебе всё покажу.
Мне щас неудобно набирать текст, я на диване валяюсь и телек смотрю.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
GAZ (статус: Посетитель), 27 июля 2014, 18:23 [#25]:
Насчёт структуры. Длина пакета 46 байт, до 40 байта в пакете зашиты функциональные параметры от 2 до 4 байт, после 40 байта контактные параметры по 1 биту, есть и пустые байты для резерва.
|
|
min@y™ (статус: Доктор наук), 27 июля 2014, 18:36 [#26]:
Цитата (GAZ):
Насчёт структуры. Длина пакета 46 байт, до 40 байта в пакете зашиты функциональные параметры от 2 до 4 байт, после 40 байта контактные параметры по 1 биту, есть и пустые байты для резерва.
Когда ж до тебя, тугодума, дойдёт, что расшифровка данных из принятых пакетов не имеет ничего общего с передачей этих пакетов по сети???!!!!111 Тема расшифровки, если у тебя с ней проблемы, заслуживает создания отдельного вопроса.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
GAZ (статус: Посетитель), 27 июля 2014, 18:58 [#27]:
Я про передачу и слова не говорил, меня волнует вопрос их получения (чтения) или весь пакет в буфер и далее его дербанить или сразу в переменные,как быстрее, биты тогда напрягают
|
|
min@y™ (статус: Доктор наук), 27 июля 2014, 19:08 [#28]:
Цитата (GAZ):
пакет в буфер и далее его дербанить
Создай новый вопрос. Опиши структуру пакета. И приложи примеры реальных пакетов (несколько штук). Далее - подробно опиши, что у тебя не получается.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
GAZ (статус: Посетитель), 27 июля 2014, 19:27 [#29]:
Ок, завтра возьму его структуру с работы и выложу, однако мне не понятно в событии какого компонента и каким методом считывать этот пакет у всех описание событий и методов разное.
|
|
min@y™ (статус: Доктор наук), 27 июля 2014, 19:29 [#30]:
Цитата (GAZ):
мне не понятно в событии какого компонента и каким методом считывать этот пакет у всех описание событий и методов разное.
Завтра покажу.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|