ورود

View Full Version : انتقال رکورد از طریق پروتکل UDP



hassan_reza
چهارشنبه 04 بهمن 1391, 23:18 عصر
سلام
یک رکورد با متغییر های زیر می خواهم از طریق TIdUDPServer ارسال کنم:

Reciver : AnsiString;
Sender : Integer;
BufferSize: Cardinal;
Buffer: Pointer;

لطف بفرمایید نحوه ارسال و دریافت را راهنمایی بفرمایید.

بهروز عباسی
چهارشنبه 04 بهمن 1391, 23:54 عصر
درود
Link زیرو ببین.
winsock, [Indy 10] How to send a record ? (http://www.mofeel.net/1279-borland-public-delphi-internet-winsock/5235.aspx)

موفق باشید.

hassan_reza
پنج شنبه 05 بهمن 1391, 15:09 عصر
ضمن تشکر
من می خواهم با TidUDPServer و از طریق BroadCast که فقط رشته ارسال می کند. یک رکورد را ارسال کنم.
برای مثال همان رکوردی که در پست قبلی اشاره کردم.
نحوه تبدیل رکورد به رشته و برعکس آن به چه صورت امکان پذیر است.

Felony
پنج شنبه 05 بهمن 1391, 16:47 عصر
در صورتی میتونید این کار رو انجام بدید که داده هاتون قابل تبدیل به رشته باشن ، اون فیلد آخر در رکوردتون ( Buffer ) یک اشاره گر در Address Space برنامه شماست ، وقتی به سیستم دیگه منتقل بشه اعتباری نداره ، باید داده های مربوط به اون رو جایی ذخیره کنید ...

الان یادم نیست متدی برای Broadcast کردن Buffer وجود داشت یا نه ولی فعلا راهی که به نظر میرسه این هست که به جای Broadcast کردن تو یک حلقه اطلاعات رو به سیستم های موجود بفرستید ، اگر لیست سیستم ها رو ندارید اول یک پیغام مثلا ( WhoRecevieThisMessage ) رو Broadcast کنید و سیستم های کلاینت موظف بشن با دریافت این پیغام آدرس IP خودشون رو به سیستم سرور که این پیغام رو فرستاده بفرستن ، حالا لیست سیستم های فعال در شبکه که برنامه کلاینت رو دارن رو دارید و میتونید سناریو مطرح شده رو پیاده کنید .

hassan_reza
پنج شنبه 05 بهمن 1391, 21:35 عصر
باتشکر از دوستان عزیز
به روش زیر کار انتقال از طریق UDP و بصورت BroadCast انجام شد...
رکوردهای تعریف شده:

type
TWaveFormatInfo = packed record
WaveFormatSize: Integer;
WaveFormat: TWaveFormatEx;
end;

TAudio = packed record
WFI: TWaveFormatInfo;
BufferSize: Cardinal;
Buffer: TIdBytes;
SenderID : Integer;
SenderName ,
ReceiverIDs : AnsiString;
end;

دو تابع برای تبدیل داده ها:

function Record2UDP(RecData:TAudio):AnsiString;
var
MS : TStringStream;
sLen : Integer;
begin
try
MS := TStringStream.Create('');

sLen:= Length(RecData.ReceiverIDs);
MS.Write(sLen,SizeOf(sLen));
MS.WriteString(RecData.ReceiverIDs);
MS.Write(RecData.SenderID,SizeOf(RecData.SenderID) );
sLen:= Length(RecData.SenderName);
MS.Write(sLen,SizeOf(sLen));
MS.WriteString(RecData.SenderName);

MS.Write(RecData.WFI.WaveFormat,SizeOf(RecData.WFI .WaveFormat));
MS.Write(RecData.WFI.WaveFormatSize,SizeOf(RecData .WFI.WaveFormatSize));
MS.Write(RecData.BufferSize,SizeOf(RecData.BufferS ize));
MS.Write(Recdata.Buffer[0],RecData.BufferSize);
MS.Position:=0;

Result := MS.DataString;
finally
MS.Create.Free;
end;
end;

function UDP2Record(sData:AnsiString):TAudio;
var
MS : TStringStream;
sLen : Integer;
begin
try
try
MS := TStringStream.Create('');

MS.WriteString(sData);
MS.Position:= 0;

MS.Read(sLen,SizeOf(sLen));
Result.ReceiverIDs:= MS.ReadString(sLen);
MS.Read(result.SenderID,SizeOf(result.SenderID));
MS.Read(sLen,SizeOf(sLen));
Result.SenderName:= MS.ReadString(sLen);

MS.Read(Result.WFI.WaveFormat,SizeOf(Result.WFI.Wa veFormat));
MS.Read(Result.WFI.WaveFormatSize,SizeOf(Result.WF I.WaveFormatSize));

MS.Read(Result.BufferSize,SizeOf(Result.BufferSize ));
setLength(Result.Buffer,Result.BufferSize);
MS.ReadBuffer(Result.Buffer[0],Result.BufferSize);
except
MS.Create.Free;
end;
finally
MS.Create.Free;
end;
end;

نحوه ارسال داده ها با TidUDPServer:

var
myA : TAudio;
begin
SetPCMAudioFormatS(@myA.WFI.WaveFormat, LiveAudioRecorder.PCMFormat);
myA.WFI.WaveFormatSize := SizeOf(myA.WFI.WaveFormat);
myA.SenderID:=3;
myA.SenderName:='hassan_reza';
myA.ReceiverIDs:='4,5';
myA.BufferSize:= BufferSize;
SetLength(myA.Buffer,BufferSize);
myA.Buffer:=RawToBytes(buffer^,BufferSize);
UDP.Broadcast(Record2UDP(myA),8989,'',TEncoding.De fault.Create);
end;

در اینجا Buffer یک پوینتر در برنامه می باشد. و BufferSize هم اندازه داده هایی که پوینتر به اون اشاره می کند.
نحوه دریافت داده ها:

procedure TForm2.udpUDPRead(AThread: TIdUDPListenerThread; AData: TBytes;
ABinding: TIdSocketHandle);
var
myA : TAudio;
begin
myA:= UDP2Record(AnsiString(TEncoding.Default.GetString( AData)));
end;

Felony
یک شنبه 03 شهریور 1392, 14:16 عصر
میشه در این مورد توضیح بدید :
چیش رو ؟!

توسط متد Broadcast یک پیغام رو به تمامی سیستم های موجود تو شبکه ارسال میکنید ، سیستم هایی که برنامه کلاینت روشون اجرا هست با دریافت این پیغام ( مثلا 'Hello' ) وظیفه دارن پیغامی رو به سیستم ارسال کننده به عنوان پاسخ بفرستن ( مثلا 'Hi' ) ، با این روش میشه فهمیده کدوم سیستم ها واقعا برنامه کلاینت درشون در حال اجرا هست ( نه صرفا رشون بودن کامپیوتر ) و قابلیت دریافت فایل یا ... رو دارن ، حالا که سیستم های دریافت کننده به ما پاسخ دادن ( Hi ) ، باید در زمان دریافت پاسخ اونها لیستی از IP اون ها تهیه کنیم تا در زمان مورد نیاز فقط به این IP ها فایل یا ... رو بفرستیم ...

خیلی از برنامه ها از همچین سناریویی استفاده میکنن ، البته راه های بهتری هم وجود داره که پیاده سازی های خاص خودش رو داره ...