Autor |
Beitrag |
oern
Beiträge: 142
Linux, Win XP
D7
|
Verfasst: Fr 30.06.06 21:37
Hi,
Ich habe noch eine Frage zur Komponente, ich habe oben im Quelltext gelesen das die maximale Paketgröße 512 byte ist. Was passiert nun wenn ich jetzt ein sagen wir 393 Byte großes Paket sende. Werden dann nur 393 Byte gesendet oder 512 Byte ?
mfg, Björn
_________________ Ich hab eine Signatur
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 30.06.06 23:28
Moin!
oern hat folgendes geschrieben: | Werden dann nur 393 Byte gesendet |
Yip, plus UDP-Protokoll-Overhead von ein paar Bytes.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
GlobalImpact
Hält's aus hier
Beiträge: 9
|
Verfasst: Do 27.07.06 17:32
Hi,
bin grad auf den Beitrag gestoßen.
Habs ordnungsgemäß installiert, nur bei mir wird ein Fehler angezeigt:
Undefinierter Bezeichner "in_addr"
Und zwar jetz konkret, wenn ich das UPDRecieve Erigniss benutze.
Edit:
Hab Delphi 2005 PE
Danke für die Antwort
mfg GlobalImpact
|
|
Fighter#1
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Do 27.07.06 17:36
Winsock muss bei uses eingebungen werden
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
PlugnPray
Hält's aus hier
Beiträge: 5
|
Verfasst: So 30.07.06 10:51
Kann mir mal einer bitte sagen, wie ich es unter Delphi 2005 zum Laufen kriege?
Die Installation bezieht sich ja nur auf Delphi 7, aber in 05 nimmt es die Dateien nicht an.
Danke.
|
|
Fighter#1
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: So 30.07.06 11:12
Einfach in den Delphi 2005 Hauptordner (nicht Bin) packen, oben einbinden dann in Private oder Public einbinden, hier ein Bsp:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| uses ...,UDPSockUtil,Winsock;
type
... procedure UdpSockUtil1Receive(Sender: TObject);
... private udp:TUDPSockUtil;
...
udp:=TUDpSockutil.Create(self); udp.Name:='Udp1'; udp.LocalPort:=2555; udp.Listen:=True; udp.OnReceive:=Form1.UdpSockUtil1Receive;
...
procedure TForm1.UdpSockUtil1Receive(Sender: TObject); var Msg: String; vonIP: in_addr; begin Msg := Udp.ReceiveText(vonIP); ShowMessage(Msg); end; |
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
PlugnPray
Hält's aus hier
Beiträge: 5
|
Verfasst: So 30.07.06 11:34
Danke schön, das ging fix
|
|
Fighter#1
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: So 30.07.06 18:45
Keiner wartet gern ...
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
redjustice
Hält's aus hier
Beiträge: 3
Win XP x64
Delphi 2005 Arch.
|
Verfasst: Sa 19.08.06 12:59
Hey!
Kurz eine Frage, ich checke das UDP Protokoll noch nicht so ganz zu 100%...
Kann man auch Broadcast's ins Internet senden?
Oder ist sowas nur im lokalen Netzwerk möglich?
Thx!
MfG red
|
|
Fighter#1
Beiträge: 787
Win XP, Ubuntu 8.04
Turbo Delphi 2006, Delphi 2005 Pe, Delphi 5 Pe, Netbeans 6.1, Eclipse, Microsoft VisualC#, Dev C++, PHP, HTML, CSS
|
Verfasst: Sa 19.08.06 14:15
Geht auch im Internet, aber nur bei einem Bestimmten Address bereich in dem du bist.
Ich glaub die Internetprovider ham so ihre eigenen Addressbereiche ...
_________________ Wer andere beherrscht ist stark,
wer sich selbst beherrscht ist mächtig. Lao Tse
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 20.08.06 00:05
Moin!
redjustice hat folgendes geschrieben: | Kann man auch Broadcast's ins Internet senden?
Oder ist sowas nur im lokalen Netzwerk möglich? |
Faktisch geht das nur im LAN, da die Provider UDP-Broadcasts fast immer filtern. (Macht auch durchaus Sinn, da sonst die Netzbelastung unnütz stark ansteigt...)
Allerdings kannst du problemlos UDP-Pakete über das Internet an bestimmte IP-Adressen versenden.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
freedy
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Fr 25.08.06 14:55
Hallo Narses!
Ich bin heute auf folgendes Problem gestoßen. Meine Delphi Entwicklungsumgebung hat eine Verbindung zu dem PC aufgenommen, der mir alle halbe Sekunde ein UDP-Paket schickt. Jetzt hat BDS2006 auch den Port belegt, der zum Abhören gedacht war. Finde ich total merkwürdig.
Seitdem läuft meine Anwendung jedenfalls nicht mehr unter der IDE. Dabei bin ich darauf gestoßen, dass noch keine Funktion gibt, die prüft, ob der Port überhaupt frei ist. Kann man (du ) das noch einbauen?
PS: Sollte jemand wissen, wie ich die Verbindung, die BDS2006 aufgebaut hat, wieder kappen kann, bitte ich um Nachricht!!!
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Fr 25.08.06 16:04
Moin!
freedy hat folgendes geschrieben: | Meine Delphi Entwicklungsumgebung hat eine Verbindung zu dem PC aufgenommen |
Warum sollte denn eine IDE(!) selbstständig(!) eine UDP-Verbindung aufbauen...
freedy hat folgendes geschrieben: | Jetzt hat BDS2006 auch den Port belegt, der zum Abhören gedacht war. Finde ich total merkwürdig. |
Allerdings, da stimmt doch was nicht...
freedy hat folgendes geschrieben: | noch keine Funktion gibt, die prüft, ob der Port überhaupt frei ist. Kann man (du ) das noch einbauen? |
Ist doch schon drin. Die Methode .Listen erzeugt dann einen Fehler, den du entsprechend behandeln kannst (WSA-Code weiß ich gerade nicht, lass ihn dir doch einfach im OnError ausgeben ).
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
freedy
Beiträge: 403
Erhaltene Danke: 1
Winows 7
Delphi XE
|
Verfasst: Fr 25.08.06 18:13
Stimmt. Auf die Fehlerbehandlung bin ich inzwischen auch schon gekommen.
Aber die IDE macht mir wirklich Sorgen. Mit einem Mal meldete die Firewall, dass besagter Rechner eine Verbindung mit BDS haben will. Gut, habe ich blockiert. Dann ging gar nichts mehr.
"netstat -ano" sagt mir, dass der Port jetzt immer von Delphi belegt ist. Warum? Keine Ahnung. Ich erkläre mir das damit, dass das BDS ja auch Nachrichten von Borland empfängt. Vielleicht lernt es ja und wenn Nachrichten zufällig auf einem Port ankommen, wird der für zukünftige auch reserviert.
Starte ich meine Anwendung zuerst und dann das BDS semmelt das total ab mit Pointerverletzungen etc. Es lässt sich dann auch nicht mehr beenden. Tja. Montag schauen wir dann mal weiter.
Ein schönes Wochenende.
|
|
Force
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Fr 15.09.06 20:22
hey, ich hab ein kleines Problem mit dem UDPSockUtil:
Ich habe einen Procedure, die aufgerufen wird, wenn man einen Button klickt oder ein timer einsetzt. Die Procedure soll an alle Server in einer Liste neun Bytes senden, wenn der Server online ist, sollte eine 166-Byte-Antwort kommen. Allerdings funktioniert die Procedure nur beim ersten Aufruf. Ab dem zweiten Aufruf sendet UDPSOckutil (so weit ich weiß) alle Anfragen nur an einen Server und empfängt nichts mehr (auch wenn die Anfragen an den richtigen Server gesendet wurden).
Hier ist der Quelltext, wär super, wenn jemand mir helfen könnte....
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button5Click(Sender: TObject); var i,j:integer; byte1,byte2,byte3:byte; begin button5.Enabled:=false; memo1.Enabled:=false; button5.Caption:='Removing empty Data'; for i:=0 to memo1.Lines.Count do begin memo1.Lines[i]:=stringreplace(memo1.Lines[i],' ','',[rfReplaceAll]); memo1.Lines[i]:=stringreplace(memo1.Lines[i],#13+#10,'',[rfReplaceAll]); if memo1.Lines.ValueFromIndex[i]='' then memo1.Lines.Delete(i);end; button5.Caption:='Removing dublicates'; for i:=0 to memo1.Lines.Count do begin for j:=0 to memo1.Lines.Count do if (memo1.Lines[i]=memo1.Lines[j]) AND (i<>j) then memo1.Lines.Delete(j); end; button5.Caption:='Scanning'; byte1:=00; byte2:=02; byte3:=32; progressbar1.Max:=memo1.Lines.Count; for i:=0 to memo1.Lines.Count do begin udpsockutil1.RemoteHost:=stringreplace(memo1.Lines[i],#13+#10,'',[rfReplaceAll]); if udpsockutil1.RemoteHost='255.255.255.255' then memo1.Lines.Delete(i) else udpsockutil1.SendText(chr(byte2)+chr(byte1)+chr(byte1)+chr(byte3)+chr(byte1)+chr(byte1)+chr(byte1)+chr(byte1)+chr(byte1)); progressbar1.Position:=i; end; button5.Caption:='Scan for Games'; button5.Enabled:=true; memo1.Enabled:=true; progressbar1.Position:=0; end; |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.UdpSockUtil1Receive(Sender: TObject); var Len: Integer; servername,gamemode,levelname,s,ip: String; vonIP: in_addr; i,currentlyplaying,maxplayers:integer; newserver:TTreenode; begin Len := UdpSockUtil1.ReceiveLength; if Len =166 then begin servername:=''; gamemode:=''; levelname:=''; s:=udpSockUtil1.ReceiveText(vonIP); ip:=string(inet_ntoa(vonIP)); ips.Add(ip); for I:=62 to 93 do servername:=servername+s[i]; for I:=94 to 125 do gamemode:=gamemode+s[i]; for I:=126 to 157 do levelname:=levelname+s[i]; currentlyplaying:=ord(s[158]); maxplayers:=ord(s[162]); newserver:=treeview1.Items.add(nil,ip+': '+servername); treeview1.items.AddChild(newserver,'Gamemode: '+gamemode); treeview1.items.AddChild(newserver,'Level: '+levelname); treeview1.items.AddChild(newserver,'Players: '+inttostr(currentlyplaying)+'/'+inttostr(maxplayers)); ping1.Hostname:=ip; ping1.ResetStatistics; ping1.action; pinging:=true; while pinging do application.ProcessMessages; treeview1.items.AddChild(newserver,'Ping: '+inttostr(lastping)+'ms'); end; |
Config von UDPSockutil1:
Broadcast=false
CloseInactive=false
LocalPort=51762
RemotePort=19400
Wie gesagt, wär echt klasse, wenn mir jemand helfen könnte...
PS: Das Scannen dauert mit dem zweiten Mal höchstens nur noch eine Sekunde, ab dem dritten Mal weniger als eine Sekunde, am Anfang dauerte es aber 2-3 Sekunden...
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 17.09.06 11:54
Moin!
Force hat folgendes geschrieben: | Hier ist der Quelltext, wär super, wenn jemand mir helfen könnte.... |
Hm, wenn du deinen Quelltext brauchbar formatierst ( STYLEGUIDE) und aussagekräftige Kommentare einfügst, dann würde ich mir das mal ansehen; aber so ist mir das zu konfus.
Force hat folgendes geschrieben: | alle Server in einer Liste |
Ein Beispiel für diese Liste wäre dann noch ganz nett.
Force hat folgendes geschrieben: | Ab dem zweiten Aufruf sendet UDPSOckutil (so weit ich weiß) alle Anfragen nur an einen Server und empfängt nichts mehr (auch wenn die Anfragen an den richtigen Server gesendet wurden). |
Wie bist du auf diese Diagnose gekommen?
Force hat folgendes geschrieben: | PS: Das Scannen dauert mit dem zweiten Mal höchstens nur noch eine Sekunde, ab dem dritten Mal weniger als eine Sekunde, am Anfang dauerte es aber 2-3 Sekunden... |
Das ist nicht sehr ungewöhnlich und könnte damit zusammenhängen, dass die DNS-Auflösung jetzt aus dem Cache bedient wird, wenn du mit Hostnamen arbeitest. Näheres kann ich erst sagen, wenn du mehr aus dem Kontext deines Projekts vorstellst.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Force
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: So 17.09.06 13:13
Zu dem Quelltext:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button5Click(Sender: TObject); var i,j:integer; byte1,byte2,byte3:byte; begin button5.Enabled:=false; memo1.Enabled:=false; button5.Caption:='Removing empty Data'; for i:=0 to memo1.Lines.Count do begin memo1.Lines[i]:=stringreplace(memo1.Lines[i],' ','',[rfReplaceAll]); memo1.Lines[i]:=stringreplace(memo1.Lines[i],#13+#10,'',[rfReplaceAll]); if memo1.Lines.ValueFromIndex[i]='' then memo1.Lines.Delete(i);end; button5.Caption:='Removing dublicates'; for i:=0 to memo1.Lines.Count do begin for j:=0 to memo1.Lines.Count do if (memo1.Lines[i]=memo1.Lines[j]) AND (i<>j) then memo1.Lines.Delete(j); end; button5.Caption:='Scanning'; byte1:=00; byte2:=02; byte3:=32; progressbar1.Max:=memo1.Lines.Count; for i:=0 to memo1.Lines.Count do begin udpsockutil1.RemoteHost:=stringreplace(memo1.Lines[i],#13+#10,'',[rfReplaceAll]); if udpsockutil1.RemoteHost='255.255.255.255' then memo1.Lines.Delete(i) else udpsockutil1.SendText(chr(byte2)+chr(byte1)+chr(byte1)+chr(byte3)+chr(byte1)+chr(byte1)+chr(byte1)+chr(byte1)+chr(byte1)); progressbar1.Position:=i; end; button5.Caption:='Scan for Games'; button5.Enabled:=true; memo1.Enabled:=true; progressbar1.Position:=0; end; |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TForm1.UdpSockUtil1Receive(Sender: TObject); var Len: Integer; servername,gamemode,levelname,s,ip: String; vonIP: in_addr; i,currentlyplaying,maxplayers:integer; newserver:TTreenode; begin Len := UdpSockUtil1.ReceiveLength; if Len =166 then begin servername:=''; gamemode:=''; levelname:=''; s:=udpSockUtil1.ReceiveText(vonIP); ip:=string(inet_ntoa(vonIP)); ips.Add(ip); for I:=62 to 93 do servername:=servername+s[i]; for I:=94 to 125 do gamemode:=gamemode+s[i]; for I:=126 to 157 do levelname:=levelname+s[i]; currentlyplaying:=ord(s[158]); maxplayers:=ord(s[162]); newserver:=treeview1.Items.add(nil,ip+': '+servername); treeview1.items.AddChild(newserver,'Gamemode: '+gamemode); treeview1.items.AddChild(newserver,'Level: '+levelname); treeview1.items.AddChild(newserver,'Players: '+inttostr(currentlyplaying)+'/'+inttostr(maxplayers)); ping1.Hostname:=ip; ping1.ResetStatistics; ping1.action; pinging:=true; while pinging do application.ProcessMessages; treeview1.items.AddChild(newserver,'Ping: '+inttostr(lastping)+'ms'); end; |
Beispiel für Liste (TMemo):
127.0.0.1
localhost
192.168.0.1
192.168.0.2
(hier stehen normalerweise IPs/DNS' für Server im Internet)
Zitat: | Wie bist du auf diese Diagnose gekommen? |
Ich hab die gesendeten/empfangen Packete aufgezeichnet
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 18.09.06 00:11
Moin!
Hm, nennst du das "formatierten Quelltext" und "aussagekräftige Kommentare"... ?
Kannst du den Code nicht mal auf die definitiv relevanten Teile kürzen und exakt beschreiben, warum du das tust (was die Befehle machen, kann ich auch sehen...)? Danke.
Was sind das für Server? Hast du die programmiert? Wer hat das Protokoll definiert? Beispiele?
Mir fällt auf Anhieb eigentlich nur folgendes am Code auf, für den Rest blicke ich einfach nicht brauchbar durch, ohne Stunden da rein zu investieren:
Force hat folgendes geschrieben: | Delphi-Quelltext 1:
| for i:=0 to memo1.Lines.Count-1 do begin | |
Du läufst mit dem Index permanent eins zu weit.
Force hat folgendes geschrieben: | Beispiel für Liste (TMemo): |
Naja, dadrauf wäre ich dann auch gerade noch selbst gekommen...
Force hat folgendes geschrieben: | (hier stehen normalerweise IPs/DNS' für Server im Internet) |
Und genau dafür hätte ich gerne mal ein Beispiel gesehen, um das mal selbst zu probieren.
Aber zumindest ist jetzt klar, warum das beim erst Aufruf länger dauert, als bei den folgenden; die Hostnamensauflösung kommt aus dem Cache. Gib mal zwischendurch "ipconfig /flushdns" ein, dann dauert das auch wieder länger.
Force hat folgendes geschrieben: | Zitat: | Wie bist du auf diese Diagnose gekommen? |
Ich hab die gesendeten/empfangen Packete aufgezeichnet |
Womit? Und was genau hast du untersucht?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Force
Beiträge: 143
Ubuntu Jaunty
FreePascal
|
Verfasst: Di 19.09.06 16:48
|
|
Narses
Beiträge: 10181
Erhaltene Danke: 1254
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.09.06 23:56
Moin!
Wenn du die Liste aus dem Archiv hast, dann würde ich sagen, da läuft einfach kein entsprechender Server oder der Antwortet nicht auf das MagicPaket.
Hier mein Testprojekt (mit spiegelndem Server, damit man das auch mal real testen kann ).
cu
Narses
Einloggen, um Attachments anzusehen!
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
|