Lesen von Daten mit TIdUDPServer
Möchte ich zum Lesen von Daten aus einem elektronischen Gerät, das Daten sendet mein PC über UDP. Ich programmiert habe einen UDP-server in Delphi. Eine Ausnahme tritt in der Klasse EIdSocketError (Fehler #10049). Hier ist mein code:
procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPServer1.Bindings.add.IP := '192.168.1.1'; //Electronic device ip
IdUDPServer1.Bindings.add.Port:= 49152; //Electronic device port
IdUDPServer1.OnUDPRead:= UDPRead;
IdUDPServer1.Active:=True;
end;
procedure TForm1.UDPRead (Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
bytes_received: integer;
begin
bytes_received:=AData.size;
end;
Was mache ich falsch?
Vielen Dank im Voraus
- Ich denke, weisen Sie das Ergebnis der IdUDPServer1.Bindungen.hinzufügen einer Variablen zu, und legen Sie dann seine IP-Adresse und Port. Wenn ich mich richtig erinnere, was Sie tun ist das hinzufügen von zwei Bindungen, eine mit IP und einem Port.
- Ich änderte den code wie folgt, aber der Fehler ist der gleiche... ich bin angenommen, dass die Bindung ip muss die ip von dem elektronischen Gerät (nicht die PC ip): var myaddress:TIdSocketHandle; begin myaddress:=IdUDPServer1.Bindungen.Hinzufügen; myaddress.IP:= '192.168.1.1'; myaddress.Port:=49152; IdUDPServer1.Bindungen.Hinzufügen.IP:=myaddress.IP; IdUDPServer1.Bindungen.Hinzufügen.Port:=myaddress.Port; end;
- Nein, mit Bindungen können Sie angeben, auf welches ethernet-adapter, die Sie hören, für UDP-Pakete.
- Ich habe verändert die bind-ip-Adresse '0.0.0.0' (und auch '127.0.0.1'), aber ich weiterhin empfangen keine Daten vom externen Gerät... Ist da irgendein Fehler in meinem code?
- Bitte aktualisieren Sie Ihre Frage mit den neuesten code, den Sie verwenden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Keith Miller erklärte, Sie missbrauchen die
Bindings
Eigenschaft. Sie sind das hinzufügen 2 Bindungen zur server - eine für192.168.1.1
auf port0
und ein weiteres für0.0.0.0
auf port49152
. Müssen Sie rufen SieBindings.Add()
nur einmal für jede IP/Port-paar, das Sie wollen, zu binden, z.B.:Oder:
Wenn Sie die
DefaultPort
Eigenschaft vor der Zeit, dann können Sie vereinfachen die oben auf dieser:Mit dieser sagte, socket error 10049 ist
WSAEADDRNOTAVAIL
, was bedeutet, dass Sie die falsche IP-Adresse in den ersten Platz. Sie müssen geben Sie eine IP-Adresse gehört auf den PC, dieTIdUDPServer
läuft auf die IP-Adresse des Geräts wird das senden von UDP-Paketen an. Sie können entweder binden die einzigen wildcard-IP -0.0.0.0
(oder nur ein leerer string "), was sagtTIdUDPServer
zu binden, um alle verfügbaren lokalen IPs:Oder Sie können Indy
GStack.LocalAddresses
- Eigenschaft, um zu bestimmen, die lokal verfügbaren IP-Adressen, und erstellen Sie separateBindings
für Sie individuell wie nötig.Update: wenn Sie binden Sie den server an port 0 zu lassen, die OS-Schnittstelle wählen, können Sie entdecken, was ein port ausgewählt wurde, indem man die
TIdSocketHandle.Port
- Eigenschaft, nachdem der server aktiviert wurde:IdStack
unit in Ihrer uses-Klausel.