Текущий архив: 2006.04.23;
Скачать: CL | DM;
ВнизКак сделать пакет данных??? Найти похожие ветки
← →
новичок111 (2006-04-02 16:38) [0]Здраствуйте, я только начал изучать Delphi, и никак не могу понять как сделать пакет данных которые потом нужно переслать другому компу по сети...
Например: заголовок-8 байт, данные 1000 байт, контрольная сумма - 4 байт.
Как это написать - реализовать, подскажите пожалуйста...
← →
Delphi_is_cool © (2006-04-02 20:26) [1]
TMyPacket = packed record
Header: array [0..7] of Byte; // заголовок-8 байт
Buffer: array [0..999] of Byte; // данные 1000 байт
ChkSum: DWORD; // контрольная сумма - 4 байт.
end;
Для работы с сетью, можешь использовать компоненты TServerSocket и TClientSocket, а учиться работать с ними, боюсь тебе придётся самому ...
← →
новичок111 (2006-04-02 21:30) [2]спасибо, но что лучше использовать компоненты Indy или эти которые ты привел?
← →
VirEx © (2006-04-02 21:37) [3]CREATE TABLE "packed" (
Header int(7),
Buffer int(999),
ChkSum int,
);
INSERT INTO "packed" VALUES (256,999,1);
^)
← →
Delphi_is_cool © (2006-04-02 22:59) [4]
> спасибо, но что лучше использовать компоненты Indy или эти
> которые ты привел?
Это зависет от того что тебе нужно, если просто установить соединение послать пакет(т.е если будешь работать как бы по своему протоколу) то я считаю что лучше те, которые я привёл(не то что лучше, скорей проще, - на мой взгяд).
← →
новичок111 (2006-04-04 21:29) [5]опять здраствуйте, вот я написал небольшую программку: клиент посылает серверу пакет данных, а сервер в ответ посылоет сообщение и так далее, но не работает, помогите разобраться что я не так делаю. вот листинг:
серверunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ScktComp;
type
TForm1 = class(TForm)
ServerSocket1: TServerSocket;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ServerSocket1.Active:=True;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
pak: Integer;
begin
pak:=Socket.ReceiveLength;
Edit1.Text:="пакет получен";
if pak=8 then
begin
ServerSocket1.Socket.SendText("принял");
Edit1.Text:="пакет получен";
end
else
begin
ServerSocket1.Socket.SendText("ошибка");
Edit1.Text:="пакет не получен";
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ServerSocket1.Active:=False;
end;
end.
клиентunit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
ClientSocket1: TClientSocket;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyPacket = packed record
ID: array [0..3] of Byte;
Info: array [0..3] of Byte;
end;
var
Form1: TForm1;
packet: TMyPacket;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientSocket1.Host:=Edit1.Text;
ClientSocket1.Active:=True;
ClientSocket1.Socket.SendBuf(packet,8);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ClientSocket1.Active:=False;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var
pak: String;
begin
pak:=Socket.ReceiveText;
if pak="принял" then ClientSocket1.Socket.SendBuf(packet,8);
end;
end.
← →
Сергей М. © (2006-04-05 09:03) [6]
> что я не так делаю
Начнем с клиента.
Поскольку ClientSocket у тебя по всей вероятности работает в режиме ctNonBlocking, многие его св-ва/методы работают асинхронно.
procedure TForm1.Button1Click(Sender: TObject);
var
BytesQueued: Integer;
begin
...
ClientSocket1.Active:=True; //это еще не факт полной и успешной активации клиента, тем самым всего лишь запущена операция установления коннекта с сервером, которая завершится либо событием OnConnect (успешно) либо событием OnError (не успешно)
//лучше и правильней всего будет выполнить SendBuf() в обработчике события OnWrite (факт готовности гнезда к передаче данных, еще точнее - факт освобождения внутреннего буфера передачи гнезда), следующем сразу за событием OnConnect
//но можно, в принципе, сделать и так:
while not ClientSocket1.Active do //!!!
Application.Processmessages;
//и уже только по факту обнаружения истинности условия ClientSocket1.Active = True выполнять прием/передачу данных
BytesQueued := ClientSocket1.Socket.SendBuf(packet,8); //обязательно проверять результат вызова send-метода ! Он покажет, сколько байт действительно было записано в очередь передачи
//Если при этом окажется, что BytesQueued = -1, следует повторить вызов send-метода позже, но не ранее чем возникнет ближайшее по времени событие OnWrite
end;
← →
новичок111 (2006-04-05 20:22) [7]послать получилось, но вот возник вопрос, весь день себе голову ломал...
пакет данных как объявлять я понял:type
TMyPacket = packed record
ID: array [0..3] of Byte;
Info: array [0..3] of Byte;
end;
но вот в этом пакете мне нужно чтобы Info имело значение строку ping, т.е.
ping=4 байта и в нем содержится только надпись ping...
А в ID мне нужно сделать счетчик и он тоже должен быть равен 4 байтам, т.е. ID:=schet; schet:=schet+1;
неподскажете где это писать и как???
← →
Джо © (2006-04-05 20:24) [8]> [7] новичок111 (05.04.06 20:22)
Ну, а помему бы сразу тогда и не объявитьID: Cardinal
и т.д.
← →
новичок111 (2006-04-05 20:40) [9]мне нужно чтобы пакет был 8 байт, поэтому я их так поделил...
вы не напишите примерный листинг как это будет выглядеть...
← →
Джо © (2006-04-05 20:41) [10]Cardinal — это 4 байта.
← →
новичок111 (2006-04-05 20:54) [11]Хорошо, а как примерно надо вписать туда это слово пинг(счетчик) и самое главное где это вписать??? я как не задаю, он мне пишет что неправильный тип...
← →
Джо © (2006-04-05 21:10) [12]
Ping: array [0..3] of Char;
...
Ping := "ping";
← →
Джо © (2006-04-05 21:10) [13]> это слово пинг(счетчик)
С каких это пор "пинг" счетчик? ;)
← →
Джо © (2006-04-05 21:13) [14]Id: Cardinal;
...
Inc(Id);
Кстати, рекоммендую по-человечески назвать поля.
Id — это идентификатор. И операции +, Inc к нему мало подходят. Возможно, стоит назвать его Count (кол-во) или Counter (счетчик).
Ping — не назвать ли его Signature, если он всегда имеет одно значение?
← →
новичок111 (2006-04-05 21:35) [15]
> С каких это пор "пинг" счетчик? ;)
я имел ввиду и как счетчик вписать, а не то что вы подумали...
Ping - имеет всегда одно и тоже значение.
Листинг, ничего не работает где я это писать должен(пишет что типы необъявлены, хотя все объявлено, я хоть правильно вставил):unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
Button2: TButton;
ClientSocket1: TClientSocket;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyPacket = packed record
Ping: array [0..3] of Char;
Info: Cardinal;
end;
var
Form1: TForm1;
packet: TMyPacket;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Ping:="Ping";
Inc(Info);
.........................
end;
......................
← →
Джо © (2006-04-05 21:50) [16]После ознакомления кода в [15] я решил не отвечать. Думаю, что в данном случае просто необходима книга по основам языка, а не какая-то смутная возня с "пакетами данных". Извини, но считаю это бесполезным.
← →
новичок111 (2006-04-05 21:55) [17]ладно, но про сетевое программирование в делфи, я книг вообще не видел, к сожалению, все что смог найти это маленькие статьи и всё, но нигде про это не сказано ни слова... буду сам пробовать методом тыка, спасибо за помощь...
Страницы: 1 вся ветка
Текущий архив: 2006.04.23;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.022 c