Delphi-PRAXiS

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

RWarnecke 1. Sep 2017 16:52

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

Zitat von Klaus01 (Beitrag 1380095)
.. 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

Nicht unbedingt. Wenn Du eine Helper-Adresse eintragen kannst, dann ist das auch so möglich.
Zitat:

Zitat von Stockoverflow-Forumsbeitrag
Cisco routers usually contain a UDP IP Helper address mode that you can use to cross the subnet.


Sherlock 4. Sep 2017 13:35

AW: Indy IdICMPClient.Ping führt auf Simulator zum Fehler
 
Ich befürchte, ich kann mich nicht darauf verlassen, daß alle Switche oder WLAN-APs alle Protokoll Goodies unterstützen. Darum muss ich auf das Pingen bzw. einem weitestgehendem Äquivalent "bestehen". Die Lösung von David Nottage, auf die SCNetworkReachability zuzugreifen erscheint dabei am elegantesten. Jedoch scheitert das Bereitstellen eines iOS-Testprojekts kläglich. (Strenggenommen ist das jetzt ein Crosspost, weil ich das Problem auch dort als Kommentar geschildert habe, aber ein echtes Forum ist das ja nicht)

Ich habe lediglich kleinste Änderungen am Projekt vorgenommen: eine Änderung des Projektnamens und NSString Typecasts durch StrToNSStr ersetzt.

Wenn ich kompiliere erhalte ich den in den Kommentaren erwähnten Hinweis (ld: warning: unknown dwarf DW_FORM_strp (offset=0xFFFFCAC6) is too big in libReachability.a(Reachability.o)).

Wenn ich aber auf dem Device ausführen möchte, erhalte ich immer den Fehler
[Error Fehler] Required local file "iOSDevice32\Debug\Pingtest" not found. Deployment failed.

In der Ausgabe sehe ich dann folgendes:
Code:
Bereitstellungsinformationen:
Bereitstellungsprofil "Wildcard (Viel Hexerei)" mit Zertifikat "iPhone Developer: Sherlock (XYZ)" wird verwendet
Build started 04.09.2017 14:27:12.
__________________________________________________
Project "F:\NetworkStateDemo\Pingtest.dproj" (Deploy target(s)):
Target _CleanRemoteDir:
    Cleaning Remote Directory: Pingtest.app
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --Clean="Pingtest.app,F:\NetworkStateDemo\Pingtest._@emb_.tmp" -u8 --Clean="Pingtest.app.dSYM,F:\NetworkStateDemo\Pingtest._@emb_.tmp" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) gelöscht...
    Insgesamt gelöschte Datei(en): 0 Datei(en) 0 Verz.
    Die Datei F:\NetworkStateDemo\Pingtest._@emb_.tmp wird gelöscht.
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPhone\FM_LaunchImage_750x1334.png,Pingtest.app\,0,Default-667h@2x.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_87x87.png,Pingtest.app\,0,FM_ApplicationIcon_87x87.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_40x40.png,Pingtest.app\,0,FM_SpotlightSearchIcon_40x40.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png,Pingtest.app\,0,FM_ApplicationIcon_152x152.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\CodeGear.Deployment.targets : warning : Local file "iOSDevice32\Debug\Pingtest.dSYM" not found. Skipping deployment.
Done building target "_DeployFiles" in project "Pingtest.dproj".
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPhone\FM_LaunchImage_2208x1242.png,Pingtest.app\,0,Default-Landscape-736h@3x.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPhone\FM_LaunchImage_1242x2208.png,Pingtest.app\,0,Default-736h@3x.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\paclient.exe -u8 --put="c:\program files (x86)\embarcadero\studio\19.0\bin\Artwork\iOS\iPad\FM_LaunchImagePortrait_1536x2048.png,Pingtest.app\,0,Default-Portrait@2x~ipad.png" myMac
    Platform Assistant Client Version 10.1.1.33
    Copyright (c) 2010-2017 Embarcadero Technologies, Inc.
   
    Verbindung zu 192.168.110.61 auf Port 64211 wird hergestellt...
    Datei(en) wird (werden) kopiert...
    Insgesamt kopierte Datei(en): 0 Datei(en) 0 Byte
Target _DeployFiles:
    c:\program files (x86)\embarcadero\studio\19.0\bin\CodeGear.Deployment.targets(492,5): error : Required local file "iOSDevice32\Debug\Pingtest" not found. Deployment failed.
Done building target "_DeployFiles" in project "Pingtest.dproj" -- FAILED.
Done building project "Pingtest.dproj" -- FAILED.
Build FAILED.
c:\program files (x86)\embarcadero\studio\19.0\bin\CodeGear.Deployment.targets : warning : Local file "iOSDevice32\Debug\Pingtest.dSYM" not found. Skipping deployment.
c:\program files (x86)\embarcadero\studio\19.0\bin\CodeGear.Deployment.targets(492,5): error : Required local file "iOSDevice32\Debug\Pingtest" not found. Deployment failed.
    1 Warning(s)
    1 Error(s)
Time Elapsed 00:00:00.68
Es werden also die Bildchen kopiert, sofern sie nicht bereits vorhanden sind, aber die dysm wird nicht erzeugt, und entsprechend nicht gefunden. Einen Hinweis, warum das nicht klappt, kann ich nicht finden....Hilfe?

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 Uhr.

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