Autor Beitrag
benicz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP
Turbo Delphi 2006
BeitragVerfasst: Mo 21.01.08 17:43 
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:
ausblenden 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..48of byte;
  parrtyp=^arrtyp;
var x,y:integer;
    z: array[1..12of 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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.
ausblenden 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; {oder open} //der Localport wird initilisiert, udp ist nun bereit zu empfangen un zusenden
end;
procedure schicken; 
type 
  arrtyp=array[1..48of byte; 
  parrtyp=^arrtyp; 
var x,y,Speed:integer; 
    z: array[1..12of LongWord; 
    inter:arrtyp; 
    point:parrtyp; 
begin 
  for x:=0 to 39 do 
   begin
    Udpout.RemotePort:='1000'
    if controller[x] then 
      begin 
        Speed:=(x*12);//Zum beschleunigen
        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.Connect; 
        Udpout.SendBuf(inter, 48); 
      end
   end
end;
benicz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: Mo 21.01.08 20:29 
Was für ne Komponente benutzt du? die vom forum?
benicz Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38

Win XP
Turbo Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: Mo 21.01.08 21:47 
versuche doch mal die komponente vom forum
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 128

MS-DOS, WIN 7, WIN 10
BP7.0, D3, D5
BeitragVerfasst: 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.