Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS Indy IdICMPClient.Ping führt auf Simulator zum Fehler (https://www.delphipraxis.net/193717-indy-idicmpclient-ping-fuehrt-auf-simulator-zum-fehler.html)

Sherlock 31. Aug 2017 15:16

Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Hi,

Ich möchte in einem lokalen Netz per Ping - bevor ich weitere Kommunikationsversuche mit unter Umständen länglichen Timeouts - feststellen, ob ein Server prinzipiell da ist. Das gelingt unter Windows, aber unter iOS im Simulator führt das zum folgenden Fehler.

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt dyld_sim ist eine Exception der Klasse EIdSocketError mit der Meldung 'Socket-Fehler # 1
' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Im Ereignisprotokoll steht

Zitat:

Erste Gelegenheit für Exception bei $00017C7C. Exception-Klasse EIdSocketError mit Meldung
'Socket-Fehler # 1
'.
Prozess dyld_sim (7063)
Ich habe mir dann eine Testapplikation zusammengeklickt, die aus einem Button, einem Label und einem IdIcmpClient besteht. Die folgenden beiden Methoden führen unter Windows zum gewünschten Ergebnis (Im Label steht "Echo")
Delphi-Quellcode:
procedure TForm11.Button1Click(Sender: TObject);
begin
  IdIcmpClient1.Ping;
end;

procedure TForm11.IdIcmpClient1Reply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
begin
  label1.Text := AReplyStatus.Msg;
end;
Unter iOS kommt weiterhin obiger Fehler.

Können die Indys unter iOS Pingen? Oder ist Pingen unter iOS verboten? Oder kann es nur der Simulator nicht?

Sherlock

RWarnecke 31. Aug 2017 16:06

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Was genau willst Du machen, nachdem Du einen Ping erhalten hast ? Willst Du Dich dann mit dem Server verbinden ? Wenn ja, warum nutzt Du dann nicht UDP ?

Sherlock 1. Sep 2017 06:52

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Ja, ich will mich mit einem SOAP-Server (sprich Apache-Server) verbinden. Für eine Prüfung per UDP müsste ich ja auf dem Server noch einen Dienst haben, der auf ein definiertes UDP Paket antwortet, oder nicht?

Sherlock

RWarnecke 1. Sep 2017 07:00

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Ja, Du müsstest auf dem Server den UPDServer haben und auf dem Gerät den UDPClient. Der Client schickt eine bestimmte Nachricht ins Netz. Der Server antwortet auf die Nachricht und gibt dann die entsprechende IP-Adresse zurück. Somit hättest Du zwei Fliegen mit einer Klappe geschlagen. Du weißt, dass Dein Server da ist und welche IP-Adresse er hat.

Sherlock 1. Sep 2017 07:42

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
In der Tat war das ohnehin ein Punkt, den ich noch erledigen wollte, also daß die Clients den Server ohne Konfiguration identifizieren können. Hmm, es bleiben dennoch die offenen Fragen:
Zitat:

Zitat von Sherlock (Beitrag 1380075)
Können die Indys unter iOS Pingen? Oder ist Pingen unter iOS verboten? Oder kann es nur der Simulator nicht?

Sherlock

Klaus01 1. Sep 2017 07:45

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Zitat:

Zitat von RWarnecke (Beitrag 1380093)
Ja, Du müsstest auf dem Server den UPDServer haben und auf dem Gerät den UDPClient. Der Client schickt eine bestimmte Nachricht ins Netz. Der Server antwortet auf die Nachricht und gibt dann die entsprechende IP-Adresse zurück. Somit hättest Du zwei Fliegen mit einer Klappe geschlagen. Du weißt, dass Dein Server da ist und welche IP-Adresse er hat.

.. dann müsste Broadcast Nachricht geschickt werden.
Wenn dies über verschiedene Netze geschehen soll - müssten die Router Broadcast Nachrichten weiterleiten.
Siehe auch: https://stackoverflow.com/questions/...across-subnets

Grüße
Klaus

nahpets 1. Sep 2017 09:17

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
https://forums.embarcadero.com/threa...hreadID=117226
Zitat:

Zitat von Remy Lebeau (TeamB)
TIdIcmpClient does not work on iOS:

http://codeverge.com/embarcadero.del...on-ios/1074816

TIdIcmpClient uses a RAW socket to implement the ICMP protocol manually.
On most platforms, use of RAW sockets is restricted to admin users only.
So you would likely have to gain root access to your iOS device in order
to use TIdIcmpClient, assuming iOS even supports RAW sockets at all.

You will have to find another solution to send pings on iOS.


Sherlock 1. Sep 2017 09:29

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Ah, Fudge... das hatte ich befürchtet. Ich habe ja schon für Win7 einen Sonderweg eingebaut (weil da auch Ping nur mit Adminrechten geht). Muss ich halt etwas finden, was unter iOS funktioniert. Danke!

Sherlock

mjustin 1. Sep 2017 09:29

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Zitat:

Zitat von Sherlock (Beitrag 1380092)
Ja, ich will mich mit einem SOAP-Server (sprich Apache-Server) verbinden.

Bei SOAP über HTTP bietet sich doch eine Indy HTTP Client Komponente mit einem kleinen Timeout an.

(Der Admin könnte den Server auch so konfiguriert haben dass er nicht auf Ping reagiert, daher ist es für den Test am aussagekräftigsten einen Verbindungsversuch mit dem konkreten Protokoll zu machen - z.B. ein HEAD auf die SOAP Endpoint-URL)

Sherlock 1. Sep 2017 10:09

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Ja, das verkleinern des Timeouts...das ist so eine Sache. Initial mag das Sinn ergeben. Nur ist mein Server so aufgebaut, das er regelmäßig neu startet, und ich da noch ein klitzgkleines Problem mit dem Aufbau der ersten Verbindung nach dem Neustart habe. Diese dauert nämlich extrem viel länger als sonst. Das ist aber evtl. in den Griff zu kriegen.

Andererseits ist nichts schneller als ein Ping. Und so habe ich vor jedem Zugriff bisher ein Ping, das prüfen soll, ob der Server prinzipiell noch erreichbar ist. Das kann nämlich aufgrund der Natur der Server (stehen frei im Raum herum und sind durch jedermann von LAN oder Strom versehentlich bis absichtlich trennbar) jederzeit geschehen. UDP als Alternative ist gerade im mobile Bereich so eine Sache. Viele Switche filtern UDP in andere Subnetze raus, und ein mobile Device könnte im WLAN einem anderen Subnetz zugeordnet sein.
Mir bleibt eigentlich nichts übrig als zu versuchen zB das hier https://developer.apple.com/library/...inkElementID_2 irgendwie in eine dylib zu verfrachten und die dann aus meiner Anwendung für den iOS-Fall anzusprechen.

Ediths weitere Recherchen ergaben eine vermutlich bessere Lösung: http://delphiworlds.com/2013/11/chec...th-delphi-xe5/ Dave Nottage stand vor wenigen Jahren vor dem gleichen Problem wie ich, und hat sich reingekniet. Offenbar funktioniert die Lösung nicht mit dem iOS-Simulator (as designed by Apple), und ich muss mir jetzt die Mühe machen, ein Testprogramm vorzubereiten. Es wäre cool, wenn das einfacher ginge. *Seufz*

Edith gibt mir ne Ohrfeige und sagt: Dafür gibts das Wildcard-Profile, Du Honk!

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz