Autor Beitrag
aenogym
Hält's aus hier
Beiträge: 11

Windows XP Home
Delphi 7 Enterprise, Win32
BeitragVerfasst: Mi 09.04.08 22:24 
Hi Narses,

erst einmal: vielen Dank für diese super Komponenten!
Jedoch habe ich ein sehr komisches Problem. Sämtliche per SendText() verschickte Nachrichten kommen doppelt bis vierfach an! Und wenn ich einen String sende, der länger als die maximale Datagrammgröße ist, dann wird jedes der aufgesplitteten Einzeldatagramme ebenfalls mehrmals gesendet!

Dieser Effekt tritt komischerweise nur bei meinem privaten PC auf (Delphi 7). Auf meinem Arbeitsrechner (Delphi 6) wird nichts doppelt versendet.

Kann sich das jemand erklären?

Dankbar,
aeno
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 17.04.08 14:01 
Moin!

user profile iconaenogym hat folgendes geschrieben:
erst einmal: vielen Dank für diese super Komponenten!
Danke für das Lob. ;)

user profile iconaenogym hat folgendes geschrieben:
Und wenn ich einen String sende, der länger als die maximale Datagrammgröße ist, dann wird jedes der aufgesplitteten Einzeldatagramme ebenfalls mehrmals gesendet!
Das ist klar, es wird ja intern auf mehrere Aufrufe runtergebrochen.

user profile iconaenogym hat folgendes geschrieben:
Sämtliche per SendText() verschickte Nachrichten kommen doppelt bis vierfach an!
Da du keinen Code oder konkretes Beispiel genannt hast, rate ich mal: du sendest Broadcasts und hast mehrere Schnittstellen? Dann ist das Verhalten zunächst mal "normal". Falle: bei einem Unicast an einen Host, dessen Adresse nicht aufgelöst werden kann, wird auf Broadcast umgeschaltet! :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Di 07.10.08 12:10 
Hi Narses,
ich glaub ich hab nen Bug gefunden...
Also auf einem Rechner läuft ein Client (mit UDPSockUtil), der im Sekundentakt was an einen Server (mit UDPSockUtil) auf einem anderen Rechner sendet. Weil der Client auch auf kleinere Kommandos des Servers auch reagieren soll, gibts da auch ein OnReceive-Eventhandler.

Wenn der Server aber nicht erreichbar ist, gibts im Client ein OnReceive-Ereignis obwohl niemand was gesendet hat. Und zwar immer unmittelbar nachdem er was gesendet hat.

Wenn ich in OnReceive die ReceivLength abfrage, steht 1 Byte drin, wenn ich aber danach mit ReceiveText das Byte abholen will um nachzusehen, was denn da so interessantes drinsteht, gibts ne Exception, die nicht mal durch Setzen des OnError Events unterdrückt werden kann.
Soll das so sein oder mache ich was falsch?
mfg Knulli
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
unit Client;
{**************************************************************************************************}
interface
{**************************************************************************************************}
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UdpSockUtil, ExtCtrls;
{**************************************************************************************************}
type
  TfrmClient = class(TForm)
    Timer1: TTimer;
    UdpSockUtil1: TUdpSockUtil;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure UdpSockUtil1Receive(Sender: TObject);
    procedure UdpSockUtil1Error(Sender: TObject; Error: Integer);
  private
    bLaberSuelz: Boolean;
  public
  end;
{**************************************************************************************************}
var
  frmClient: TfrmClient;
{**************************************************************************************************}
implementation
{$R *.dfm}
{**************************************************************************************************}
uses
  WinSock;
{**************************************************************************************************}
procedure TfrmClient.FormCreate(Sender: TObject);
begin
  bLaberSuelz := false;
  UDPSockUtil1.LocalPort  := 12346;
  UDPSockUtil1.RemotePort := 12345;
  UDPSockUtil1.RemoteHost := '192.168.100.100';
  UDPSockUtil1.CloseInactiveSockets := true;
  UDPSockUtil1.Open();
  Timer1.Enabled := true;
end;
{**************************************************************************************************}
procedure TfrmClient.Timer1Timer(Sender: TObject);
var
  st: String;
begin
  if bLaberSuelz then st := 'Laber' else st := 'Sülz';
  bLaberSuelz := Not bLaberSuelz;
  UDPSockUtil1.SendText(st);
end;
{**************************************************************************************************}
procedure TfrmClient.UdpSockUtil1Error(Sender: TObject; Error: Integer);
begin
  // ShutUp exceptions
end;
{**************************************************************************************************}
procedure TfrmClient.UdpSockUtil1Receive(Sender: TObject);
var
  FromAddr: in_Addr;
  stCmd: String;
  Anzahl: Integer;
begin
  try
    Anzahl := UDPSockUtil1.ReceiveLength();
    if Anzahl > 0 then
    begin
      stCmd := UDPSockUtil1.ReceiveText(FromAddr);

      if stCmd = 'Hier spricht Dein Meister' then
        UDPSockUtil1.SendText('Ja, Chef...');
    end;

  except
    Windows.Beep(100010);
  end;
end;
{**************************************************************************************************}
end.
vladi4k
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Di 07.10.08 12:40 
Hallo,
ich hatte gleiches Problem wie Knulli
nur anders gelöst:

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:
//original
function TUdpSockUtil.ReceiveText(var RemoteAddr: in_addr): String;
begin
  SetLength(Result,ReceiveLength);
  SetLength(Result,ReceiveBuf(Pointer(Result)^,Length(Result),RemoteAddr));
end;


//neu
function TUdpSockUtil.ReceiveText(var RemoteAddr: in_addr): String;
begin
  SetLength(Result,ReceiveLength);

  if Result<>#0 then //nur wenn was drin ist
  SetLength(Result,ReceiveBuf(Pointer(Result)^,Length(Result),RemoteAddr))
  else //ansonsten Fehlermeldung

        if Assigned(FOnError) then
        FOnError(Self,WSAECONNRESET)
        //FOnError(Self,10054) // mit diesem Fehler melden
      else
        raise EUSUError.CreateFmt('Zielhost nicht erreichbar!',[]);

end;



Das Problem war das mein Programm immer abgestürzt hat wenn ich per Timer an ein Host sendete der nicht erreicht war UND in dieser Zeit Fenster von meinem Programm angeklickt habe (z.B. Fenster schieben oder Menü aufklappen). :(


:roll: Vladi

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 07.10.08 13:19 
Moin!

user profile iconKnulli hat folgendes geschrieben Zum zitierten Posting springen:
Also auf einem Rechner läuft ein Client (mit UDPSockUtil), der im Sekundentakt was an einen Server (mit UDPSockUtil) auf einem anderen Rechner sendet. Weil der Client auch auf kleinere Kommandos des Servers auch reagieren soll, gibts da auch ein OnReceive-Eventhandler.

Wenn der Server aber nicht erreichbar ist, gibts im Client ein OnReceive-Ereignis obwohl niemand was gesendet hat. Und zwar immer unmittelbar nachdem er was gesendet hat.
Wird beim Senden jedes mal der Host aufgelöst oder arbeitest du immer mit einer festen IP-Adresse?

Das die WSA was zu einem nicht erreichbaren Host "zu sagen hat", ist erstmal normal. AFAIR wird da ein ICMP-Paket bei Ablehnung und ein internes Ereignis bei Nichterreichbarkeit ausgelöst, inwieweit das in Fensternachrichten (und welche) umgesetzt wird, kann ich aus der Kopf nicht sagen, muss mal in der WSA-Doku wühlen gehen... :lupe: :les:

user profile iconKnulli hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich in OnReceive die ReceivLength abfrage, steht 1 Byte drin,
Kann mich düster erinnern, dass der IOControl-Call nicht immer exakte Werte liefert (deshalb ja auch die Nachkorrektur beim Lesen), allerdings sollte da nie mehr als tatsächlich da ist, rauskommen... :? :gruebel:

Ich schau´s mir mal an. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Knulli
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 116
Erhaltene Danke: 2

Win2k, Win7, Win10
D5, D2005, D2006, D2007, D10.4.2
BeitragVerfasst: Di 07.10.08 13:44 
Hi Narses,

Zitat:

Wird beim Senden jedes mal der Host aufgelöst oder arbeitest du immer mit einer festen IP-Adresse?

ich verwende feste IP Adressen:
ausblenden Delphi-Quelltext
1:
UDPSockUtil1.RemoteHost := '192.168.100.100';					


Sowohl Sender-PC (mehrere) als auch der Empfänger-PC bekommen von mir eine feste IP.
Server = Empfänger: 192.168.100.100
Client = Sender: 192.168.100.101 .. 192.168.100.199

gibt eigentlich schon eine neuere Version als V1.0.0?

mfg Knulli
delphi.crash
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 31.03.09 22:20 
hi,

ich weiß ich bin ein bisschen spät, aber super komponente!
mir stellt sich jetzt die frage, wie kann ich denn die ip eines antwortenden (bei mir) servers im OnReceive-event auflösen?

z.B. habe ich eine listbox und möchte den antwortenden auflisten:
via

ausblenden Delphi-Quelltext
1:
2:
server:= UdpUtil1.RemoteAddress;
listbox.items.append(server);


funktioniert das logischerweise ja nicht :)

bin über jede hilfe dankbar,
greetz
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 31.03.09 22:27 
Moin und :welcome: im Forum!

user profile icondelphi.crash hat folgendes geschrieben Zum zitierten Posting springen:
wie kann ich denn die ip eines antwortenden (bei mir) servers im OnReceive-event auflösen?
Die Antwort auf diese Frage steht als Quelltext im ersten Beitrag dieses Threads. :zwinker: Schonmal reingesehen? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
delphi.crash
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 31.03.09 22:30 
jetzt wo dus sagst :D

danke
BlumenhunD
Hält's aus hier
Beiträge: 5


Delphi / Enterprise
BeitragVerfasst: Do 21.05.09 20:10 
Hallo !

hab deine kompo mal ausprobiert.
bei mir hat sie nur funktioniert wenn ich, selber einen LokalPort festgelegt habe.
ansonstent kommt socket error 10022 ( invalid argument )


Edit: wenn ich mit der kompo arbeite bekomm ich immer ne AccessViolation beim Schließen der Anwendung, egal ob ich bei OnClose .Free FreeAndNil() oder .Close garnix mache

Edit2: ich hab den fehler im Disassembler gefunden: call ntdll.ZwContinue
anscheinend will er vor der finalization noch ne datei aufrufen dei längst freigegeben ist.

Edit3: Der Fehler beim Schließen kommt nur, wenn ich etwas gesendet habe

_________________
viele liebe Grüße
vom BlumenhunD :D
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 21.05.09 22:43 
Moin und :welcome: im Forum!

Zeig mal deinen Code, mit deiner Beschreibung kann ich nix anfangen. :nixweiss: Welche Delphi-Version verwendest du?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
API
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Fr 22.05.09 01:58 
Hallo

Ich habe versucht, die Komponente unter Delphi 2009 zum Laufen zu bringen.
Jedoch werden beim Senden eines Strings zum Teil nicht korrekte Zeichen übertragen.
Ich nehme an, es gibt noch Problemstellen mit Ansi/Unicode.

Folgende Änderungen habe ich gemacht:

ausblenden volle Höhe 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:
32:
33:
34:
35:
36:
37:
38:
42c42
<     FRemoteHost: String; // dahin senden
---
>     FRemoteHost: AnsiString; // dahin senden
60c60
<     procedure SetRemoteHost(const Value: String);
---
>     procedure SetRemoteHost(const Value: AnsiString);
90c90
<     property RemoteHost: String read FRemoteHost write SetRemoteHost;
---
>     property RemoteHost: AnsiString read FRemoteHost write SetRemoteHost;
226c226
<   FRemoteAddr.S_addr := INADDR_BROADCAST;
---
>   FRemoteAddr.S_addr := Integer(INADDR_BROADCAST);
369c369
<     FRemoteAddr.S_addr := INADDR_BROADCAST;
---
>     FRemoteAddr.S_addr := Integer(INADDR_BROADCAST);
383c383
<   if (Value.S_addr = INADDR_BROADCAST) then
---
>   if (Value.S_addr = Integer(INADDR_BROADCAST)) then
392c392
< procedure TUdpSockUtil.SetRemoteHost(const Value: String);
---
> procedure TUdpSockUtil.SetRemoteHost(const Value: AnsiString);
401,402c401,402
<       FRemoteAddr.S_addr := inet_addr(PChar(Value)); // IPdotdot?
<       if (FRemoteAddr.S_addr = INADDR_NONE) then begin // nein, DNSresolve
---
>       FRemoteAddr.S_addr := inet_addr(PAnsiChar(AnsiString((Value)))); // IPdotdot?
>       if (FRemoteAddr.S_addr = Integer(INADDR_NONE)) then begin // nein, DNSresolve
491c491
<         ToAddr.sin_addr.S_addr := INADDR_BROADCAST
---
>         ToAddr.sin_addr.S_addr := Integer(INADDR_BROADCAST)
Einloggen, um Attachments anzusehen!
API
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 23.05.09 07:16 
Hat jemand eine Idee, wie ich die Komponente unter D2009 zum Laufen bringe?
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: So 24.05.09 23:30 
Moin und :welcome: im Forum!

user profile iconAPI hat folgendes geschrieben Zum zitierten Posting springen:
Hat jemand eine Idee, wie ich die Komponente unter D2009 zum Laufen bringe?
Ich habe kein D2009, deshalb kann ich das nicht testen.

Nimm D7(pro), ist für Win32 eh das beste Delphi. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
API
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 26.05.09 19:34 
Welches das beste Delphi ist 1. subjektiv und 2. kommt drauf an, was man machen möchte resp. muss.

Hat vielleicht sonst jemand eine Idee im DF?
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 26.05.09 19:44 
Moin!

user profile iconAPI hat folgendes geschrieben Zum zitierten Posting springen:
Welches das beste Delphi ist 1. subjektiv
Oh, das ist durchaus objektiv betrachtbar :| aber die Diskussion führt zu nichts, das ist wahr. ;)

user profile iconAPI hat folgendes geschrieben Zum zitierten Posting springen:
resp. muss.
Du wärst der erste, der D2009 nehmen "muss". :?

user profile iconAPI hat folgendes geschrieben Zum zitierten Posting springen:
Hat vielleicht sonst jemand eine Idee im DF?
Was stört dich an den Indy-Kompos, wenn du den TUdpSockUtil nicht zum Laufen kriegst? :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Piranha
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 31



BeitragVerfasst: Mi 01.07.09 19:19 
So, jetzt muss ich den Thread auch mal ausgraben.

Ich wollte ganz gerne mal die Broadcasts von UPnP einfangen. Aber irgendwie bekomm ich das nicht auf die Reihe. Mein Router castet von 192.168.1.1 auf 239.255.255.250 Port 1900. Standard halt. Doch was muss ich jetzt bei der UDP Komponente genau machen? Ich hab schon alle möglichen Kombinationen durchprobiert. Local-Port auf 1900, Remote auf 1900 oder Remote auf 1900 und Local auf 0 Remote Addr auf 255.255.255.255 oder auf 239.255.255.250 ... irgendwie kommt da nie was an.
Das da was ankommen müsste lässt sich an WireShark nachweisen.
Zur sicherheit von UPnP bin ich mir im klaren und das muss auch nicht in jedem Post erwähnt werden :D

Btw. Das was ankommt lasse ich einfach in einem Memo ausgeben.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 03.07.09 11:34 
Moin!

user profile iconPiranha hat folgendes geschrieben Zum zitierten Posting springen:
Mein Router castet von 192.168.1.1 auf 239.255.255.250 Port 1900. Standard halt.
Ich weiß noch nicht so genau, was du da machst, aber das oben ist nicht die Broadcastadresse des Netzes 192.168.1.1/8. :nixweiss: Das wäre 192.168.1.255. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Piranha
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 31



BeitragVerfasst: So 05.07.09 18:42 
uPnP Broadcastet immer auf 239.255.255.250 Port 1900... das wollte ich halt einfach mitlesen.

Hat sich jetzt eh erledigt, da ich gelesen hab das das Windows schon für mich macht und ich jetzt nurnoch mit der API kämpfen muss.
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10181
Erhaltene Danke: 1254

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 23.02.10 22:38 
Moin!

Kaum zu glauben aber wahr: ich habe mal die Anpassungen für Unicode-Delphi-Versionen eingebaut. Download im ersten Beitrag, wie immer. ;)

Kann das mal einer unter D2k9 testen? Ich habe nur ein D2010 zum Test hier. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.