Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.26;
Скачать: CL | DM;

Вниз

Надежность - UDP   Найти похожие ветки 

 
Romych   (2002-10-21 20:04) [0]

Неужели такая плохая надежность UDP если обём передаваемой информации 100-200 байт 50% потерь,
1-2 Кб - 80 % потерь,
я пользуюсь стандартной компонентой из закладки FastNet можна ли поднять надёжность?
Другие компоненты? Нстройки?
Если кто то имеет опыт работы с широковещательным вещанием посоветуйте что нибудь ПОЖАЛУЙСТА.


 
Malder ©   (2002-10-21 23:45) [1]

А ты где UDP используешь ?

Но если даже в инете на диал-апе... то все равно такие потери - это очень много. Скорее всего, неправильно реализован механизм отправки/приема UDP


 
romych   (2002-10-22 12:00) [2]

Я его использую в локалке! Если есть немного времени у Вас я бы сбросил процедуру отсылки и приема, может Вы бы что нибудь посоветовали :)


 
romych   (2002-10-22 13:22) [3]

unit Unit1;

interface

uses
Windows, SysUtils, Forms,
Classes, Controls, Buttons, NMUDP, ExtCtrls, Grids, Dialogs,
StdCtrls, strgrdex, ScktComp, Menus;

procedure TForm1.FormCreate(Sender: TObject);
begin
NMUDP1.LocalPort := 6767;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
Var
sb : String;
j, i : Integer;
begin
NMUDP1.ReadBuffer(stArr, i);
SB:=StringOfChar(" ", NumberBytes);
For j:=1 to NumberBytes do sb[j]:=stArr[j];
Memo1.Lines.Add(sb);
Buffer:=Buffer+SB;
end;


procedure TForm1.VykonatyKomandu(s : str4);
var
Init :TWSAData;
SockOpt :BOOL;
Sock :TSocket;
Target :TSockAddrIn;
//
stData, LineMemo, Komu : String;
DataBytes : Word;
i , j, LenStr, KodKom : Word;
KodS : Byte;
begin
WSAStartup( $101,Init );
Sock := Socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );
SockOpt := TRUE;
SetSockOpt( Sock, SOL_SOCKET, SO_BROADCAST, PChar(@SockOpt), SizeOf(SockOpt) );
//
Target.sin_port := htons( 6767 );//номер порта
Target.sin_addr.S_addr := INADDR_BROADCAST;
Target.sa_family := AF_INET;
//
stData:="<"+MyNic+";"+MyIp+";"+Komu+";"+s+";"+IntToStr(KodKom)+";>";
//
DataBytes := Length( stData );
//
for i:= 1 to DataBytes do
begin
stArr[ i ] := stData[ i ];
end;
SendTo( Sock, stArr, DataBytes, 0, Target, SizeOf(Target) );
//
WSACleanup;
end;



end.


 
romych   (2002-10-22 13:24) [4]

Кодом со мной поделились :)

unit Unit1;

interface

uses
Windows, SysUtils, Forms,
Classes, Controls, Buttons, NMUDP, ExtCtrls, Grids, Dialogs,
StdCtrls, strgrdex, ScktComp, Menus;

procedure TForm1.FormCreate(Sender: TObject);
begin
NMUDP1.LocalPort := 6767;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
Var
sb : String;
j, i : Integer;
begin
NMUDP1.ReadBuffer(stArr, i);
SB:=StringOfChar(" ", NumberBytes);
For j:=1 to NumberBytes do sb[j]:=stArr[j];
Memo1.Lines.Add(sb);
Buffer:=Buffer+SB;
end;


procedure TForm1.VykonatyKomandu(s : str4);
var
Init :TWSAData;
SockOpt :BOOL;
Sock :TSocket;
Target :TSockAddrIn;
//
stData, LineMemo, Komu : String;
DataBytes : Word;
i , j, LenStr, KodKom : Word;
KodS : Byte;
begin
WSAStartup( $101,Init );
Sock := Socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP );
SockOpt := TRUE;
SetSockOpt( Sock, SOL_SOCKET, SO_BROADCAST, PChar(@SockOpt), SizeOf(SockOpt) );
//
Target.sin_port := htons( 6767 );//номер порта
Target.sin_addr.S_addr := INADDR_BROADCAST;
Target.sa_family := AF_INET;
//
stData:="<"+MyNic+";"+MyIp+";"+Komu+";"+s+";"+IntToStr(KodKom)+";>";
//
DataBytes := Length( stData );
//
for i:= 1 to DataBytes do
begin
stArr[ i ] := stData[ i ];
end;
SendTo( Sock, stArr, DataBytes, 0, Target, SizeOf(Target) );
//
WSACleanup;
end;



end.


 
romych   (2002-10-22 14:12) [5]

Если кто то работал с UDP помогите.


 
Malder ©   (2002-10-22 22:56) [6]

Да при чем здесь UDP не UDP - у тебя код вообще корявый.
Особо не разбирался...

Зачем ты путаешь WinAPI программирование и VCL ? Ты уж выбери что-нибудь одно. А то у тебя прием через NMUDP, а посылка через WinAPI.

Сразу видная ошибка:

...
j, i : Integer;
begin
NMUDP1.ReadBuffer(stArr, i);
...


а что находится в i в момент выполнения NMUDP1.ReadBuffer(stArr, i) ?

Да и вообще, что это за способы преобразования

for i:= 1 to DataBytes do
begin
stArr[ i ] := stData[ i ];
end


зачем это ?

Вообщем, переписал бы заново лучше...


 
romych   (2002-10-24 09:12) [7]

Malder покапример приема и отсылки несколько строк, ПОЖАЛУЙСА преобразования типов,... я переделаю.


 
Malder ©   (2002-10-24 19:23) [8]

romych, ЧЕГО ?


 
romych   (2002-10-25 00:48) [9]

Как отправить и получить широковещательное сообщение(UDP)


 
romych   (2002-10-25 13:07) [10]

Malder напиши несколько строк не корявого кода ПОЖАЛУЙСТА!


 
Malder ©   (2002-10-25 18:55) [11]

Кода, делающего что ?


 
romych   (2002-10-25 21:21) [12]

Отсылающего бродкаст, и ловящего его.


 
Malder ©   (2002-10-26 01:57) [13]

На форме есть Button1, Memo1, Edit1, NMUDP1

Код формы:

unit Unit1;
...
var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var data:PChar;
begin
if edit1.text="" then exit;
try
try
GetMem(data,length(edit1.text));
except on EOutOfMemory do showmessage("Не хватает памяти");
end;
data:=strpcopy(data,edit1.text);
try
NMUDP1.SendBuffer(data^,length(edit1.text)) ;
except on UDPSockError do
begin
showmessage("Невозможно отправить");
raise;
end;
end;
finally
FreeMem(data);
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{Здесь надо написать броадкаст адрес той сети, для которой делаете этот самый броадкаст}
NMUDP1.RemoteHost:="XXX.XXX.XXX.XXX";
NMUDP1.RemotePort:=31337;
NMUDP1.LocalPort:=31337;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
var data:pchar;
begin
try
try
GetMem(data,numberbytes+1);
except on EOutOfMemory do showmessage("Не хватает памяти");
end;
NMUDP1.ReadBuffer(data^,numberbytes);
memo1.Lines.Add("От "+FromIP+": "+data);
finally
freemem(data);
end;

end;

end.


Если с данным кодом будут такие же потери - сообщите


 
romych   (2002-10-27 14:30) [14]

Привет Malder.
Проблема в том, что мне нужно отослать широковещательное сообщение, BROADCAST на все компютеры сети, а в твоем коде сообщение можна послать только на один компютерс определенным IP.


 
Malder ©   (2002-10-27 17:42) [15]

romych, ты читать умеешь ?

{Здесь надо написать броадкаст адрес той сети, для которой делаете этот самый броадкаст}
NMUDP1.RemoteHost:="XXX.XXX.XXX.XXX";


Ну так и напиши там броадкаст адрес своей сети и сообщение придет всем. БЛИН.


 
romych   (2002-10-27 19:44) [16]

Я писал бродкаст не доходит даже на сам компютер который посылает NMUDP1.RemoteHost:="255.255.255.0";
NMUDP1.RemoteHost:="192.168.1.1";
Что Вы понимаете под адресом сети????
Адрес компютера, маску подсети???


 
romych   (2002-10-27 19:45) [17]

Я писал бродкаст не доходит даже на сам компютер который посылает NMUDP1.RemoteHost:="255.255.255.0";
NMUDP1.RemoteHost:="192.168.1.1";
Что Вы понимаете под адресом сети????
Адрес компютера, маску подсети; сеть одноранговая, без выделенногго сервера???

Если указать конкретно IP компа всё работает!


 
Malder ©   (2002-10-27 23:28) [18]

romych, напиши адрес 192.168.1.255


 
romych   (2002-10-28 00:36) [19]

На одном компе работает, завтра попробую на сети.
Большое спасибо Malder.


 
romych   (2002-10-28 11:58) [20]

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

ИЗВИНИТЕ за надоедливость, и возможно тупость.


 
Malder ©   (2002-10-28 21:16) [21]

Да нет, не извиняйся - это я виноват. Хотя не пойму где ошибка, так как нельзя посмотреть код методов sendbuffer и readbuffer у TNMUDP.

Используй следующий код:

procedure TForm1.Button1Click(Sender: TObject);
{Здесь ограничение на посылку 255 байтов. Увеличивай размер массива, если хочешь переслать больше}
var data:array[0..254] of char;
i:integer;
begin
if length(edit1.text)>length(data) then
begin
showmessage("Слишком много данных отправляется");
exit;
end;
if edit1.text="" then exit;
for i:=1 to length(edit1.text) do
data[i-1]:=edit1.text[i];
try
NMUDP1.SendBuffer(data,length(edit1.text)) ;
except on UDPSockError do
begin
showmessage("Невозможно отправить");
raise;
end;
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
NMUDP1.RemoteHost:="127.0.0.255";
NMUDP1.RemotePort:=31337;
NMUDP1.LocalPort:=31337;
end;

procedure TForm1.NMUDP1DataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String; Port: Integer);
{Здесь ограничение на прием 255 байтов. Увеличивай размер массива, если хочешь принять больше}
var data:array[0..255] of char;
begin
if numberbytes>length(data)-1 then
begin
showmessage("Слишком много данных пришло");
exit;
end;
NMUDP1.ReadBuffer(data,NumberBytes);
data[NumberBytes]:=#0;
memo1.Lines.Add("От "+FromIP+": "+data);
end;


Удачи


 
romych   (2002-10-31 20:32) [22]

Большое спасибо, кажется все получилось.



Страницы: 1 вся ветка

Текущий архив: 2002.12.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.016 c
1-85948
race1
2002-12-15 14:05
2002.12.26
image


1-85951
Виталий
2002-12-15 14:14
2002.12.26
Компонент для работы с XML


3-85862
and_sp
2002-12-03 09:32
2002.12.26
Paradox в Excel


4-86215
danilka
2002-11-12 13:50
2002.12.26
Как отследить скроллинг TScrollBox?


1-85961
Cherepovets
2002-12-15 16:57
2002.12.26
Файл