Entwickler-Ecke
Internet / Netzwerk - UDP performance
benicz - Mo 21.01.08 17:43
Titel: UDP performance
hallöle!
ich habe ein mittelgroßes problem mit meinem TUdpSocket:
mein programm reagiert auf ereignisse und schickt daraufhin an bis zu 40 empfänger (von servern kann man nicht wirklich sprechen...) im netz jeweils ein UDP-paket.
da die events auch mit bis zu einer millisekunde auftreten können, erzeugt das ne ganze menge pakete.
das problem scheint nun zu sein, dass die ganze connecterei durch den socket ewig braucht, und damit eine ziemliche verzögerung verursacht.
und das bringt mich gleich zur nächsten verständnisfrage:
UDP ist ja ein verbindungsloses protokoll.
dass ich einen socket, um ihn zu nutzen, "active" setzen muss, sehe ich ja noch ein.
ein open als übergeordnete stufe dazu mag ja in gottes namen auch sein.
wozu aber muss ich einen verbindungslosen socket verbinden(connect) ?! :shock:
dazu kommt nämlich, dass anscheinend jedesmal, wenn ich etwas schicke, ein anderer localport gesendet wird (sagt mir wireshark).
wird der bei jedem connect geändert?
kann ich mit dem TUdpSocket auf eine weise verfahren, dass er mir quasi als "tunnel nach draußen" dient, wo ich einfach pakete rausschieben kann, ohne, dass er immer irgendwas an seiner verbindung macht?
ein bisschen code gibt's hier:
Delphi-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:
| procedure schicken; type arrtyp=array[1..48] of byte; parrtyp=^arrtyp; var x,y:integer; z: array[1..12] of LongWord; inter:arrtyp; point:parrtyp; begin for x:=0 to 39 do begin if controller[x] then begin for y:=1 to 12 do z[y]:=Ausgabe[y+(x*12)] and sperre[y+(x*12)]; Udpout.RemoteHost:='192.168.0.'+inttostr(x+129); Udpout.RemotePort:='1000'; point:=@z; inter:=point^; Udpout.Connect; Udpout.SendBuf(inter, 48); end; end; end; |
das spiel mit point, inter und z ist nur dazu da, um das casten nach char zu beschleunugen.
ich freue mich auf viele, hilfreiche antworten! ;-)
LorenzS - Mo 21.01.08 18:40
Beim Open von Udp wird nur dein serverport geöffnet. beim senden muss nix connected werde.
Open macht man nur beim programm start.
Und wenn du etwas Senden willst, änders du nur remoteHost und remotePort (wenn nötig), dann kannst du einfach senden.
Delphi-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:
| procedure Tform1.Oncreate(sender:tobject); begin Udpout.Connect; end; procedure schicken; type arrtyp=array[1..48] of byte; parrtyp=^arrtyp; var x,y,Speed:integer; z: array[1..12] of LongWord; inter:arrtyp; point:parrtyp; begin for x:=0 to 39 do begin Udpout.RemotePort:='1000'; if controller[x] then begin Speed:=(x*12); for y:=1 to 12 do z[y]:=Ausgabe[y+] and sperre[y+Speed]; Udpout.RemoteHost:='192.168.0.'+inttostr(x+129); point:=@z; inter:=point^; Udpout.SendBuf(inter, 48); end; end; end; |
benicz - Mo 21.01.08 19:16
hmm...
erstmal danke!
aber bei mir passiert nix, solange ich nicht unmittelbar vorm senbuf connecte.
kann es daher kommen, dass ich udpout create, bevor das hauptfenster existiert.
es passiert in einer init-prozedur, die im hauptprogramm direkt nach application.initialize aufgerufen wird.
gibt es eine reihenfolge, die ich beachten muss?
sprich: [parameter setzen]>[active:=true]>[open]>[connect] oder so?
LorenzS - Mo 21.01.08 20:29
Was für ne Komponente benutzt du? die vom forum?
benicz - Mo 21.01.08 20:54
ich benutze den tudpsocket aus der unit "sockets".
bzw. ist das der gleiche, den man sich aus dem "internet"-bereich der kompo-liste rüberziehen kann.
ich erzeuge ihn aber halt zur laufzeit.
es klappt nur, wenn ich in der selben prozedur connecte, in der ich auch sende.
wenn ich in der initialisierung connecte, klappt es nicht.
kann es sein, dass man nach einer änderung des remote-host nochmal connecten muss?
zum verständnis:
connect macht (für meine zwecke) das gleiche wie open,
active brtauche ich nicht zu setzen.
dann nochwas:
der local-port bleibt inzwischen beim gleichen wert, ist aber immernoch nicht der, den ich eingestellt habe...
LorenzS - Mo 21.01.08 21:47
versuche doch mal die komponente vom forum
Bernhard Geyer - Di 22.01.08 08:34
Falls es XP ist: Hat XP nicht eine eingebaute Bremse die (AFAIK primär um Würmer zu bremsen) nach 20 (?) Verbindungen einfach mal etwas langsamer macht :?:
LorenzS - Di 22.01.08 22:39
die 10 halboffenen verbindungen von XP SP2 gilt nur für tcp, weil es bei upd garkeine verdindungen gibt. Bei Udp wird es einfach nur raus geschickt ohne zuprüfen ob es ankommt.
Es wird nicht wirklich Langsamer sondern alle über den 10 halboffenen verbindungen werden in einer liste gesammelt und warten bis sie dran kommen, dabei kann es unter Umständen zu timeouts kommen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!