php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
Alt 27.05.2011, 16:13  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Zitat:
Zitat von MTN Beitrag anzeigen
@Istegelitz Wenn ich das also richtig verstanden habe, muss ich die Socketverbindung mit stream_set_blocking($socket, 0)
Im Prinzip ja, aber ganz so einfach ists dann doch nicht. Non-blocking sockets muss man ein wenig anders behandeln als blocking-sockets.

Lies mal ein bischen im Internet, wie Sockets funktionieren, was blocking bedeutet und wo der Unterschied zwischen den non-blocking und den blocking sockets liegt...

z.B.
http://www.scottklement.com/rpg/sock...nblocking.html
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 27.05.2011, 16:36  
MTN
Neuer Benutzer
 
Registriert seit: 25.05.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
MTN befindet sich auf einem aufstrebenden Ast
Standard

Es müsste demnach daran liegen, dass sie Response vom Server entweder fehlt oder nicht die bei fread angegebenen 1000byte hat, oder?
Was mich dann aber immer noch wundert ist, dass der Befehl ja (anscheinend) gesendet wurde, da DoCommand vor GetResponse (wo er ja hakt) ausgeführt wurde. Beim Auslesen der Serverantwort bekommt er nicht das, was er bei fread möchte. Demnach müsste der Befehl ja trotzdem ausgeführt werden, selbst wenn das Skript danach nicht mehr funktioniert...
MTN ist offline   Mit Zitat antworten
Alt 27.05.2011, 17:08  
MTN
Neuer Benutzer
 
Registriert seit: 25.05.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
MTN befindet sich auf einem aufstrebenden Ast
Standard

Ich bin mal etwas zu dem Basics zurück und habe mal eine Test.php mit einer frischgeladenen PHPTelnet.php-Datei erstellt:

PHP-Code:
require_once("PHPTelnet.php");
if (
$telnet = new PHPTelnet) echo "Referenz erstellt<br>";
$result $telnet->Connect('127.0.0.1',"mtn","PASSWORD");
if (
$result == 0) {
echo 
"Telnet steht!";
$telnet->DoCommand('say Hello'$result);
// NOTE: $result may contain newlines
echo $result;
$telnet->DoCommand('say Hello2'$result);
echo 
$result;
// say Disconnect(0); to break the connection without explicitly logging out
$telnet->Disconnect();

Ergebnis von Test.php
Zitat:
Referenz erstellt
Telnet steht! ÿüÿý
PHPTelnet.php:
PHP-Code:
<?php
/*
PHPTelnet 1.1.1
by Antone Roundy
adapted from code found on the PHP website
public domain
*/

class PHPTelnet {
    var 
$show_connect_error=1;

    var 
$use_usleep=0;    // change to 1 for faster execution
        // don't change to 1 on Windows servers unless you have PHP 5
    
var $sleeptime=125000;
    var 
$loginsleeptime=1000000;

    var 
$fp=NULL;
    var 
$loginprompt;

    var 
$conn1;
    var 
$conn2;
    
    
/*
    0 = success
    1 = couldn't open network connection
    2 = unknown host
    3 = login failed
    4 = PHP version too low
    */
    
function Connect($server,$user,$pass) {
        
$rv=0;
        
$vers=explode('.',PHP_VERSION);
        
$needvers=array(4,3,0);
        
$j=count($vers);
        
$k=count($needvers);
        if (
$k<$j$j=$k;
        for (
$i=0;$i<$j;$i++) {
            if ((
$vers[$i]+0)>$needvers[$i]) break;
            if ((
$vers[$i]+0)<$needvers[$i]) {
                
$this->ConnectError(4);
                return 
4;
            }
        }
        
        
$this->Disconnect();
        
        if (
strlen($server)) {
            if (
preg_match('/[^0-9.]/',$server)) {
                
$ip=gethostbyname($server);
                if (
$ip==$server) {
                    
$ip='';
                    
$rv=2;
                }
            } else 
$ip=$server;
        } else 
$ip='127.0.0.1';
        
        if (
strlen($ip)) {
            if (
$this->fp=fsockopen($ip,23)) {
                
fputs($this->fp,$this->conn1);
                
$this->Sleep();
                
                
fputs($this->fp,$this->conn2);
                
$this->Sleep();
                
$this->GetResponse($r);
                
$r=explode("\n",$r);
                
$this->loginprompt=$r[count($r)-1];

                
fputs($this->fp,"$user\r");
                
$this->Sleep();

                
fputs($this->fp,"$pass\r");
                if (
$this->use_usleepusleep($this->loginsleeptime);
                else 
sleep(1);
                
$this->GetResponse($r);
                
$r=explode("\n",$r);
                if ((
$r[count($r)-1]=='')||($this->loginprompt==$r[count($r)-1])) {
                    
$rv=3;
                    
$this->Disconnect();
                }
            } else 
$rv=1;
        }
        
        if (
$rv$this->ConnectError($rv);
        return 
$rv;
    }
    
    function 
Disconnect($exit=1) {
        if (
$this->fp) {
            if (
$exit$this->DoCommand('exit',$junk);
            
fclose($this->fp);
            
$this->fp=NULL;
        }
    }

    function 
DoCommand($c,&$r) {
        if (
$this->fp) {
            
fputs($this->fp,"$c\r");
            
$this->Sleep();
            
$this->GetResponse($r);
            
$r=preg_replace("/^.*?\n(.*)\n[^\n]*$/","$1",$r);
        }
        return 
$this->fp?1:0;
    }
    
    function 
GetResponse(&$r) {
        
$r='';
        do { 
            
$r.=fread($this->fp,1000);
            
$s=socket_get_status($this->fp);
        } while (
$s['unread_bytes']);
    }
    
    function 
Sleep() {
        if (
$this->use_usleepusleep($this->sleeptime);
        else 
sleep(1);
    }
    
    function 
PHPTelnet() {
        
$this->conn1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
            
chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
            
chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
            
chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
            
chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
            
chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
            
chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
            
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
            
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
            
chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
            
chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
            
chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
        
$this->conn2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
            
chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
    }
    
    function 
ConnectError($num) {
        if (
$this->show_connect_error) switch ($num) {
        case 
1: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/fsockopen.php">Connect failed: Unable to open network connection</a><br />'; break;
        case 
2: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/unknown-host.php">Connect failed: Unknown host</a><br />'; break;
        case 
3: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/login.php">Connect failed: Login failed</a><br />'; break;
        case 
4: echo '<br />[PHP Telnet] <a href="http://www.geckotribe.com/php-telnet/errors/php-version.php">Connect failed: Your server\'s PHP version is too low for PHP Telnet</a><br />'; break;
        }
    }
}

return;
?>
MTN ist offline   Mit Zitat antworten
Alt 27.05.2011, 17:26  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

Richtig erkannt. Das Kommando wurde gesendet, es blockiert ja auch nicht die Zeile "fputs" oder "fwrite", sondern "fread":
Du liest im 1000-Byte-Häppchen - es müssen also immer ganze Vielfache dieser Menge gesendet werden, anderenfalls blockiert dein Script, sobald es noch nicht genügend Daten (bzw. EOL) empfangen hat.

Mit non-blocking Sockets umgehst du nun diese Problematik, handelst dir aber neue ein.

Ein non-blocking Socket kehrt sofort nach dem Aufruf zurück zum Aufrufer und meldet einen Status, anhand dessen entschieden werden kann, wie es weiter gehen muss (ein sog. "Peek"). In deinem Beispiel würde fread() sofort zurückkehren und dir 0-1000 Byte liefern. Du musst nun solange lesen, bis alle Daten emfpangen wurden (wann du das machst, ist egal, deswegen kehrt die Funktion auch sofort zurück - hast du noch nicht alle Daten empfangen, wurden sie vielleicht noch nicht vollständig übertragen, du kannst also derzeit was anderes machen, oder erneut fread() aufrufen, um zu sehen ob weitere Daten vorliegen).

Das ganze Thema ist ziemlich komplex und nicht unbedingt trivial. Blocking sockets lassen sich so einfach programmieren, weil das Lesen auf die Daten "wartet", wohingegen du bei non-blocking Sockets die asynchrone Natur selber implementieren musst.

Beispiel für ein Non-Blocking Read Script (ungetestet)
PHP-Code:
/* non-blocking read */
function nb_fread($socket$length 1024) {
  
// schon em Ende?
  
if (feof($socket)) 
    return -
1

  
// es kommen evtl. noch Daten...
  
$data fread($socket$len);
  
  
// noch nichts neues da, also geben wir nichts zurück
  // wir beenden die Übertragung aber auch noch nicht, weil wir selber noch kein EOF erhalten haben
  
if (strlen($data) == 0// 
    
return 0;

  
// $data enthält nun 1-1024 Byte Daten, die wir zurückliefern
  
return $data;
}

/* Arbeitssimulation */
function workerThread() {
  echo 
"I'm working sooooo hard...\n";
}

// nimmt die Daten auf...
$complete_data ""
$data null;

// Verbindung aufbauen, non-blocking
$mySocket fsockopen(...);
socket_set_nonblock($mySocket);

// $data = -1 -> Ende der Übertragung | $data = null -> z.Zt. keine Daten vorliegend
while ($data !== -1) {
  
$data nb_fread($mySocket);

  
// nur wenn wirklich Daten vorliegen, an die bereits vorhandenen Daten anhängen
  
if ($data != && strlen($data) > 0
    
$complete_data .= $data;

  
// solange die Übertragung noch nicht abgeschlossen ist, können wir noch andere Dinge erledigen
  
workerThread();

Achtung, der Code ist aus dem Ärmel geschüttelt und bestimmt nicht lauffähig. Nur zu Demonstrationszwecken!
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 27.05.2011, 17:28  
MTN
Neuer Benutzer
 
Registriert seit: 25.05.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
MTN befindet sich auf einem aufstrebenden Ast
Standard

Wenn das Kommando gesendet wurde, müsste es ja eigentlich in meiner Telnetserver Konsole auftauchen...
MTN ist offline   Mit Zitat antworten
Alt 27.05.2011, 17:34  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

EDIT - folgende Seite übersehn
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 27.05.2011, 17:36  
MTN
Neuer Benutzer
 
Registriert seit: 25.05.2011
Beiträge: 14
PHP-Kenntnisse:
Fortgeschritten
MTN befindet sich auf einem aufstrebenden Ast
Standard

@eagle275
EDIT (jetzt irrelevant):
Zitat:
PuTTY is a free implementation of Telnet and SSH for Windows and Unix platforms
Wo ist also das Problem? :P

Wenn ich mit der Windows Console und "telnet localhost" verbinde funktioniert das auch einwandfrei!

Geändert von MTN (27.05.2011 um 18:06 Uhr).
MTN ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Datenbank über Notepad bearbeiten. Anthony70 PHP Einsteiger 4 21.04.2011 21:43
VB-Prog mit COM-Objekt über shell_exec aufgerufen bricht ab emtiqor PHP-Fortgeschrittene 5 04.04.2011 20:17
[Erledigt] Summation über Unterabfragen - Mysql jume Datenbanken 20 30.05.2010 09:58
AD zugriff über PHP jared566 PHP Tipps 2010 6 12.05.2010 11:32
Kein Zugriff über ODBC mit der IP-Adresse auf MySql DB Datenbanken 4 09.02.2006 11:04
[Erledigt] Problem mit dem Füllen einer Tabelle über Formular PHP Tipps 2006 18 10.01.2006 12:51
Remote öffnen von txt über php? PHP-Fortgeschrittene 6 08.11.2005 22:58
Grafik über mehrere Zellen einer Tabelle neodrei HTML, Usability und Barrierefreiheit 9 18.08.2005 19:26
PHP und telnet php1 PHP-Fortgeschrittene 8 19.04.2005 16:45
Javascript über Javascript erstellen HTML, Usability und Barrierefreiheit 2 19.11.2004 18:02
DB-backup über Script Datenbanken 6 22.10.2004 11:23
Zugang über dyndns Datenbanken 0 12.10.2004 15:31
Seitenauswahl über Domain PHP Tipps 2004 4 10.09.2004 13:09
[Erledigt] Daten in DB schreiben (über Schleife) PHP Tipps 2004 4 21.07.2004 08:52
Umleitung über Meta-Angaben im Header abhängig vom Host PHP Tipps 2004 7 14.06.2004 12:34

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
phptelnet script conn1 and conn2, php \non blocking sockets\ \kein eof\, php socket lesen \kein eof\, php telnet, telnet header 0xff

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum