Pregunta

Estoy escribiendo una sencilla biblioteca cliente telnet. Abro tomas utilizando fsockopen () y leer y escribir en el enchufe por medio de fgetc () y fwrite (). Yo uso fgetc () en lugar de fread () para manejar Telnet comandos especiales y opciones como (IAC, ...).

el problema es que la mayoría de veces que estoy leyendo de la toma, se tarda demasiado tiempo para volver. como he perfilado ello, se necesita tanto tiempo como los tiempos de espera de la conexión, y después de eso no tengo los resultados.

Estos son mi método de lectura:

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

Actualmente utilizo esta condición para asegurarse de que la corriente está terminado:

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

¿hay alguna otra manera de descubrir que la corriente se termina una todos los datos se leen?

uDate: Creo que el carácter EOF en el protocolo Telnet no es lo que espera PHP como EOF, y es por eso que el guión no puede encontrar final de la secuencia. ¿alguien sabe cuál es el EOF (final del archivo) personaje de protocolo Telnet?

¿Fue útil?

Solución

Trate haciéndose eco de los valores hexadecimales de cada personaje que recibe. Usted debe ser capaz de ver lo que está recibiendo como EOF, aunque PHP no lo reconoce como tal. Mira en ord () y bin2hex ()

Otros consejos

Hay feof() que puede ser útil.

busqué y no encontré nada útil. Luego trató de averiguar cuál es el telnetlib en python hace por este problema (Estoy aprendiendo Python), y descubrí que incluso la biblioteca de Python no busca EOF. que sólo mantiene la lectura de la corriente hasta que el tiempo de espera, o una cierta cantidad de tiempo pasa, o buscar una cadena especial devuelve un resultado. por lo que utiliza el mismo método para leer y resuelto mi problema. Gracias por todas las respuestas y comentarios. Voy a tratar de convencer a mi compañía para distribuir esta biblioteca telnet con una licencia de código abierto compatible. Si esto ocurriera, voy a actualizar aquí.

Telnet no tiene un final de token de corriente (char). Simplemente envía el mensaje y deja de enviar. Así que la mejor manera de hacerlo es atrapar a su flujo de salida en el texto del mensaje.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top