Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.12.26;
Скачать: [xml.tar.bz2];

Вниз

Надежность - 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.007 c
1-86018
kull
2002-12-15 12:28
2002.12.26
Помогите пропарсить HTML...


4-86226
Артём
2002-11-13 01:23
2002.12.26
Драйвера


4-86228
N
2002-11-10 16:57
2002.12.26
Ошибка при удалении File Mapping


1-85997
harismatik
2002-12-16 11:52
2002.12.26
Выбор узла в TTreeView


3-85790
dimonf
2002-12-05 18:23
2002.12.26
Как переопределить VertScrollBar в DBGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский