Текущий архив: 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;
{Здесь ограничение на прием 255 байтов. Увеличивай размер массива, если хочешь принять больше}
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);
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.5 MB
Время: 0.01 c