Bereitstellung Serversocket

Habe ein Problem,
die Suche hat mir leider auch nicht helfen können,
möchte im IP-Symcon einen Serversocket bereitstellen, um von einem anderen Programm aus irgendwelche Strings an IP-Symcon zu senden. Das funktioniert im groben und ganzen, jedoch bringt IPS nach einer weile folgende Fehlermeldung:

Habe folgenden Code verwendet:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : socketopen.ips.php
Trigger  : 
Interval : 
*/
$socket = stream_socket_server("tcp://127.0.0.1:4080", $errno, $errstr);
if (!$socket)
   {
      echo "$errstr ($errno)<br />
";
   }
   else
   {
      while ($conn = stream_socket_accept($socket)) {
      fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "
");
      IPS_SLEEP(2000);
      echo fgets($conn, 1000);
      fclose($conn);
   }
  fclose($socket);
}


?>

IP-Symcon Ausgabe nach dem Durchlauf incl. Fehlermeldung:

5555
Warning: stream_socket_accept() [function.stream-socket-accept]: accept failed: Ein Verbindungsversuch ist fehlgeschlagen, da die Gegenstelle nach einer bestimmten Zeitspanne nicht ordnungsgemäß reagiert hat, oder die hergestellte Verbindung war fehlerhaft, da der verbundene Host nicht reagiert hat. in C:\Programme\IP-Symcon\scripts.currentscript on line 17

Die 5555 ist OK das ist der wert den ich im oben zu sehenden Programm gesendet habe das die Verbindung zum Server herstellt. Außerdem bricht der Server die Verbindung ab nach dem Empfang der Daten. Möchte die Verbindung jedoch Dauerhaft stehen lassen.

folgendes ist mein Problem: Möchte erstmal die Fehlermeldung beseitigen und dann zyklisch z.b. alle 500-1000ms den Socket abfragen ob neue Meldungen vorhanden sind. Und diese dann weiterverarbeiten. (in Variablen schreiben, anzeigen ändern oder ähnliches). Hat jemand eine Idee wie ich dies bewerkstelligen könnte und wo der fehler ist?

Die Verbindung hat einen Default Timeout.
Versuche mal den Timeout-Parameter auf -1 zu setzen, um eine dauernde Verbindung zu erhalten

while ($conn = stream_socket_accept($socket,-1)) { 

Tommi

Hmm nicht die beste Idee, da dadurch ein IPS Script in Dauerschleife läuft… Außerdem hast du bestimmt den Script Timeout ausgeheblt, oder?

paresy

Funktioniert mit der vorgeschlagenen Lösung leider nicht. Nun kommt zwar kein Timeout von der Funktion mehr, jedoch von IP-Symcon (nach 180sek).
Habe nun folgendne Quellcode (mit IF statt WHILE) mit dem funktioniert das ganze prinzipiell, aber leider noch nicht so wie es nacher sein sollte.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : sockopenet.ips.php
Trigger  : 
Interval : 
*/
$socket = stream_socket_server("tcp://127.0.0.1:4080", $errno, $errstr);
if (!$socket)
   {
      echo "$errstr ($errno)<br />
";
   }
   else
   {
      if ($conn = stream_socket_accept($socket))
      {
         fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "
");
         IPS_SLEEP(2000);
         echo fgets($conn, 1000);
         fclose($conn);
      }
  fclose($socket);
   }

?>

Sollte nacher so sein, das man einmal den Serversocket bereitstellt, der dann auch immer geöffnet bleibt, und erst wenn IP-Symcon beendet wird soll dieser auch beendet werden.
Das Problem jedoch ist, der Serversocket soll geöffnet bleiben (ohne Timeout),
aber es soll zyklisch geprüft werden ob es neue Nachrichten gibt
(bzw. ob neue Meldungen vom Client an den Socket geschickt wurden).

Dieser Teil soll Zyklisch geprüft werden:

     
 if ($conn = stream_socket_accept($socket))
      {
         fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "
");
         IPS_SLEEP(2000);
         echo fgets($conn, 1000);
         fclose($conn);
      } 

Wenn du es so machst, wird dein IP-Symcon nicht mehr herunterfahren können, weil das Script sich nie beendet und IPS beim Shutdown auf alle Scripte wartet.

Kannst du das nicht umdrehen, sodass du dich als Client per COMLAN verbindest?

paresy

OK habe es nun umgedreht, funktioniert nun fast 100%ig.
Was noch störend ist, ist das wenn die Verbindung abbricht zwischen Server und COM-Port von IP-Symcon, funktionierts nicht mehr.
Server geht automatisch wieder in den Listeningmode auf dem eingestellten Port, jedoch IP- Symcon macht keinen auomatischen reconnect,
hier muß ich jedes mal in die Instances und muß in den Einstellungen des COM-Ports wieder auf Connect klicken.

Das selbe passiert, wenn IP-Symcon vor dem Server gestartet wird.
Die Einstellung „Anzahl der Verbindungsversuche in IP-Symcon hat keinen Einfluss darauf.“
Gibts hier ne Lösung dafür?
z.B. Änderung am Modul, Scriptaufruf um einen Reconnect des Moduls zum Server auszulösen, oder sonstiges?
Vielen Dank
micha

hi blood3d. sag mal, darf ich dich fragen woher du das programm oben hast? ich versuche für meine hausautomation gerade ebenfalls daten zu senden und abzuholen über eigene ports.

dch bevor ich die daten an einem echten server sende, würde ich die gerne vorher testen. monitor programme die anzeigen was gesendet wird habe ich ne handvoll gefunden, aber keins das auch direkt daten senden kann (ich will z.b. den status eines gerätes zurückbekommen).

kannst du mir mal ne adresse von dem programm geben, mit google nach namen suchen, der in der titelleiste des programmes angezeigt wird, komme ich nicht weiter.

das wär klasse, danke!

p.s.: wenn jemand dieses oder ein ähnliches programm kennt, mit denn man auch daten senden kann - dann wäre ich euch sehr dankbar wenn ihr mir weiterhelfen könntet. danke!

zb. Tamos Essential Nettools kann es (www.tamos.com/products)
damit kannst du ‚raw‘ daten senden zu einem IP und bestimmten port. Weiss jetzt nur nicht mehr ob es in die ‚probe‘ version diese möglichkeit gibt.
Schlage mal vor : downloaden und probieren. Ich nutze es ab und zu mal und funzt.

Für Leute, die sich mit der Socket-Programmierung mit .net beschäftigen möchten, ist vielleicht dieser Link interessant:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemNetSocketsTcpClientClassTopic.asp