Question

J'écris une bibliothèque simple client telnet. J'ouvre prises en utilisant fsockopen () et lire et écrire sur le support en utilisant fgetc () et fwrite (). J'utilise fgetc () au lieu de fread () pour gérer les commandes spéciales Telnet et des options telles que (IAC, ...).

le problème est que la plupart des fois que je lis de la prise, il prend trop de temps pour revenir. comme je l'ai profilé, il prend aussi longtemps que les temps de connexion sur et après que je les résultats.

voici ma méthode de lecture:

protected function getChar()
{
    $char = fgetc( $this->_socket );
    return $char;
} // public function getChar()

actuellement, j'utiliser cette condition pour faire que flux est terminé:

$char = $this->getChar();
if ( $char === false ) {
    // end of the stream.
}

est-il une autre façon de savoir que le flux est terminé une toutes les données sont lues?

udate: Je pense que le caractère EOF dans le protocole Telnet est pas ce que PHP attend que EOF, et c'est pourquoi le script ne peut pas trouver fin du flux. personne ne sait quel est le caractère EOF (fin de fichier) dans le protocole Telnet?

Était-ce utile?

La solution

Essayez écho les valeurs hexadécimaux de chaque personnage que vous recevez. Vous devriez être en mesure de voir ce que vous recevez comme EOF, même si PHP ne le reconnaît pas comme tel. Regardez dans ord () et bin2hex ()

Autres conseils

Il y a feof() qui peut être utile.

J'ai cherché et n'a pas trouvé quelque chose d'utile. puis j'ai essayé de savoir ce que le telnetlib en python fait pour ce problème (je suis juste python d'apprentissage), et je trouve que même la bibliothèque Python ne recherche pas EOF. il ne cesse de lire le flux jusqu'à ce qu'il arrive à expiration, ou une certaine quantité de temps passe, ou la recherche d'une chaîne spéciale renvoie un résultat. donc j'utilisé la même méthode pour la lecture et résolu mon problème. Merci pour toutes les réponses et commentaires. Je vais essayer de convaincre mon entreprise de distribuer cette bibliothèque telnet avec une licence open source compatible. si cela se produisait, je mettrai à jour ici.

Telnet ne dispose pas d'une fin de jeton de flux (char). Il envoie juste l'invite et cesse d'envoyer. Donc, la meilleure façon est de piéger votre flux de sortie sur le texte de l'invite.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top