mit php eine Socket Verbindung herstellen

Status
Für weitere Antworten geschlossen.

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo Forum Teilnehmer,
möchte im Heimnetzwerk von einer IP-Adresse (Gira Homeserver) ein Datenfeld an eine im Hintergrund laufende php Anwendung (die auf dem DS214+ laufen wird) übergeben. Die php Anwendung auf dem NAS Server (DS214+) soll Daten aus der MariaDB 5 lesen und an den Gira Homeserver zurücksenden. Es sollte eine TCP Verbindung sein.
Dafür wollte ich eine Socket Verbindung erstellen:
php Code habe ich erfasst:

<?php
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
echo "Socket created". "<br />\n";
//Connect socket to Gira Homeserver
if(!socket_connect($sock , '192.168.xxx.yy' , 55zzz))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not connect: [$errorcode] $errormsg \n");
}
Code geht noch weiter...
Die php Anwendung liefert mir leider diese Fehlermeldung:
Socket created
Warning: socket_connect(): unable to connect [111]: Connection refused in /volume1/web/fa_telpho_empfang.php on line 14 Could not connect: [111] Connection refused

Der create socket läuft noch durch, nicht aber der Connect.
Die entscheidende Frage ist nun: was mache ich falsch? Habe auch schon mal eine andere Port-Nr genommen, aber immer die gleiche Fehlermeldung.
Danke für Eure wertvolle Hilfe.
Gruß
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
bin nicht sicher ob 0 der richtige Socketparameter für Protocol ist. Mal SOL_TCP resp SOL_UDP probiert?
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo,
danke für die schnelle Rückantwort. Habe statt der 0 diesen Befehl:
if(!($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))
erfasst, aber leider die gleiche Fehlermeldung erhalten.
Gruß
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
hm also connection refused heisst eigentlich, dass etwas von der Gegenstelle zurückkommt und zwar ein REJECT
Was passiert wenn du von der DS aus mittels telnet ein Verbindung aufbaust?
Code:
telnet 192.168.xxx.yy 55zzz
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo,
habe Probleme mit dem telnet. Mit meiner Windows-PC kann ich mich mit putty an der DS per SSH anmelden. Das sehe ich dann im Resourcenmonitor der DS.
Wie / Wo kann ich nun den Telnet Befehl eingeben? In der Systemsteuerung habe ich telnet freigeben. Wenn ich nach der Anmeldung mit putty auf der linux Ebene den Befehl telnet ipadr port eingebe kommt command not found.
Danke für Deine Hilfe.
Gruß
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
das Aktivieren von telnet im DSM ist nur für den Zugriff auf die DS. Du hast auf deiner DS nirgends ein telnet Kommando?
Code:
find  / -type f -name telnet
obiger find ergibt nix bei dir?
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo,
der find liefert mir sehr viele Ergebnisse aber leider ist telnet in dem Suchergebnis nicht dabei. Muss ich telnet für die DS separat installieren? Oder ist das Tool irgendwo versteckt mit dabei?
Danke und Grüße
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
hm also entweder sollte der find genau ein Resultat bringen oder sonst keines. Wobei ich gerade gemerkt habe, dass telnet ja ein Link auf busybox ist (zumindest hier bei mir)
Code:
find / -name telnet
also den -type f mal weglassen. Immer noch nichts. Bei mir ist telnet in /usr/bin drin
Existiert bei dir busybox unter /bin/ ? Wenn ja dann könnte man es imho mittels symlink lösen (falls telnet bei dir wirklich ned existiert)
Code:
ln -s /usr/busybox /usr/bin/telnet
dann sollte es mit telnet eigentlich klappen
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
sorry,
auch busybox gibt es nicht auf der synology ds214+ mit DSM 6.x
habe mit find /usr -name busybox nach telnet und busybox gesucht, aber nichts gefunden.
Nochmals auf den php Code zurück, gibt es dort noch eine Möglichkeit am Code etwas zu testen?
Grüße
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Nochmals auf den php Code zurück, gibt es dort noch eine Möglichkeit am Code etwas zu testen?
drum wollte ich auf telnet hinaus, damit kannst du testen ob die DS überhaupt eine Verbindung zu Gira aufbauen darf.
Denn
unable to connect [111]: Connection refused
ist imho recht eindeutig. Ein refused heisst, dass die Gegenstelle oder irgendein Netzwerkgerät auf dem Weg von der DS zu Gira, mit einem TCP RST Paket reagiert hat. Sonst hättest du einen connection timeout bekommen. Aus dem würde ich persönlich folgern, dass der php Code nicht das Problem ist, sondern irgendwo z.B. eine Firewall reinspielt. PHP gibt dir imho korrekt den verweigerten Verbindungsversuch zurück
Bei solchen Geschichten ist telnet eben sehr hilfreich. Damit kann man einfach testen ob man überhaupt eine TCP Verbindung zu Ziel öffnen kann/darf.

my 5cents ;-) Guck ob auf dem Gira Dingens eine Firewall läuft und wenn ja wie die Regeln für den Zugriff auf deinen gewünschten Port 55zzz ausschauen
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo lb. Moderator,
habe einen Kurswechsel vollzogen. Da ich auf einem Raspberry vor einiger Zeit in pyhton solch eine socket Kommunikation in python realisiert habe, machte ich einen Schwenk auf python.
Die Befehle sind ähnlich und die Kommunikation mit dem Gira Homeserver klappt einwandfrei und zwar in beide Richtungen.
Einziges Problem das ich nun habe: der Homeserver sendet mir einen String der eine Telefon-Nr enthält. Nun möchte ich mit einem kleines Select in der Mysql DB weitere Daten zu dem Anrufer lesen. Dazu muss ich in python zu Beginn den Befehl :
import MYSQLdb
schreiben. Bei der Ausführung bekomme ich die Meldung: Import Error : no Modul named MySQLdb
Auf der NAS ist MariaDB 5 und MariaDB 10 bereits lauffähig installiert. Diese Anwendung möchte ich nicht verändern.
Sicherlich kannst Du mir weiterhelfen da python das Modul MySQLdb findet.
Danke für Deine Hilfe.
Grüße von
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
dann reden wir jetzt also nicht mehr von der DS? Hast du auf dem Raspi python-pip installiert? Damit kann man am einfachsten python Module installieren. Oder du guckst in den Repos des Raspi ob es bereits ein python-mysqldb Paket gibt. Via pip sollte es so gehen
Code:
pip install MySQL-python
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo,
nein das python Programm mit der Schnittstelle zu der MySQLDB soll auf dem NAS DS214+ laufen.
Der Raspberry hatte ich vor einiger Zeit in einer anderen Sache zum Test.
Ich brauche auf dem NAS für das python Programm das Modul MySQLdb.
Beim Import des Moduls kommt die Meldung:
Import Error no Modul MYSQLdb.
Wie kann ich das Modul auf dem NAS DS214+ nachinstallieren ohne aber die DB-Einstellungen auf dem NAS zu gefährden?
Danke.
Gruß
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
ganz so einfach kann man Zusatzmodule bei der DS kaum installieren. Zudem: was wenn auch python ein connection refused bekommt? Das halte ich für recht wahrscheinlich, denn dein PHP müsste imho sonst flutschen. Haste den PHP Code mal auf dem Raspi probiert?
Um auf der DS das Modul nachzuinstallieren musst du erst python-pip installieren. Lade dir dazu: https://bootstrap.pypa.io/get-pip.py und installiere es danach mittels
Code:
python /pfad/zum/file
pip installieren. Das klappt bei mir ohne Fehler. Leider kommt es beim Installieren von MySQL-python dann zu einem Fehler, weil eine Abhängigkeit auf der DS nicht vorhanden ist
EnvironmentError: mysql_config not found
dies befindet sich normalerweise im Paket libmysqlclient-dev
Da dies aber kein python Paket ist, lässt sich das nicht so ohne Weiteres installieren.
Ich habe bei mir auf der DS ipkg (such im Forum und im Wiki dazu) installiert und dann versucht das mysql Modul zu installieren. Aber auch hierbei wirft das ipkg python einen Fehler
ImportError: libmysqlclient_r.so.14: cannot open shared object file: No such file or directory
Dann habe ich gesehen, dass ipkg python ziemlich Steinzeit ist (python 2.6). Also habe ich via ipkg den mysql5 entfernt und das ipkg Paket mysql (version 4) installiert.
Code:
/opt/bin/python2.6 
Python 2.6.8 (unknown, Apr 12 2012, 19:00:10) 
[GCC 4.2.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>>
der Import klappt. Aber wie gesagt Steinzeit Version von python :)

Ich würde dir empfehlen trotzdem den PHP Code zu nutzen. Teste den mal auf dem Raspi und guck ob von dort eine Verbindung klappt. Mit dem PHP Code hättest du den Vorteil einer einigermassen aktuellen Version. Zudem ist die Installation von ipkg ein ziemlicher Eingriff ins System.
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
Hallo lb. Moderator,
habe in Step 1 versucht mit php vom Raspberry einen Datentransfer zu realisieren. Eine Verbindung habe ich hinbekommen aber Daten habe ich nicht empfangen.
Mit dem NAS DS214+ und php habe ich nicht mal eine Verbindung hinbekommen.
Bin wieder zu dem Stand zurückgekehrt der schon mal lief: Raspberry mit python. Das Programm stürzt zwar immer wieder mal undefiniert ab, aber wenn man die Ansprüche runterschraubt, dann läuft die Anwendung überhaupt schon mal.
Mir ist nun bewusst, das ich das NAS nur dafür nutzen kann, für die es fertige Anwendungen gibt, oder mit php Scripte schreiben kann, die nicht allzu tief ins System einsteigen.
Schade eigentlich bei einem solch tollen System.
Danke für Deine Hilfe
Grüße von
Ekkehard
 

jahlives

Benutzer
Mitglied seit
19. Aug 2008
Beiträge
18.275
Punkte für Reaktionen
4
Punkte
0
Mir ist nun bewusst, das ich das NAS nur dafür nutzen kann, für die es fertige Anwendungen gibt, oder mit php Scripte schreiben kann, die nicht allzu tief ins System einsteigen.
das kann ich so nicht stehen lassen. Habe deinen PHP Code genommen auf meine DS geklatsch und konnte problemlos einen Socket auf https von www.google.ch öffnen.
Zum x-ten Mal: du wirst gefirewalled beim Zugriff von deiner DS auf den Gira! Da kann weder php noch python was für
Jetzt teste das BITTE mal z.B. indem du mit dem PHP Code eine Verbindung auf einen Endpunkt aufbaust wo du WEISST (weil geprüft), dass die DS eine Verbindung machen darf. Vorher werde ich nicht eine Zeile python Code für dich debuggen
 

EkkiBlg

Benutzer
Mitglied seit
05. Sep 2014
Beiträge
34
Punkte für Reaktionen
0
Punkte
0
toll wenn es bei Dir geht, das hilft mir nur nicht weiter. Aber mit dem muss ich nun leben.
Debuggen kann ich selbst, dafür brauche ich keine externe Hilfe.
Danke für die wertvolle Hilfe.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat