es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agregue el carácter de fin de línea o nueva línea en el tubo FIFO.

Quiero implementar una utilidad donde pueda capturar la respuesta del servidor TCP e imprimirla en la terminal en ciertos intervalos.

Por favor, consulta el siguiente código:

#!/bin/bash
# creando dos tuberías FIFO nuevas
rm -f inputPipe
mkfifo inputPipe
rm -f outputPipe
mkfifo outputPipe

#abriéndolas
perl -e 'open(my $fh, ">", "inputPipe"); sleep 3600 while 1' &
pid1=$!
perl -e 'open(my $fh, ">", "outputPipe"); sleep 3600 while 1' &
pid2=$!

#cualquier cosa que escriba en inputPipe debe ir al servidor TCP y la respuesta del servidor TCP debe ser capturada en outputPipe
cat inputPipe | nc -v 192.168.1.105 19204 > outputPipe &
pid3=$!

#el búfer TCP se escribe en inputPipe, que irá al servidor TCP y luego el servidor responderá
echo -e "\x5A\x01\0\x01\0\0\0\x1C\x04\x4C\0\0\0\0\0\0" > inputPipe
#buscando continuamente la respuesta del servidor y luego, después de leer la respuesta, consultando la misma información nuevamente después de 2 segundos
while true;
  do
**#el problema principal que tengo aquí es al leer la respuesta del servidor porque en la respuesta del servidor no hay ningún salto de línea o carácter nuevo, por lo tanto, la siguiente instrucción de lectura se cuelga indefinidamente.**
    if read line;
    then
      echo $line;
      sleep 2;
      echo -e "\x5A\x01\0\x01\0\0\0\x1C\x05\x15\0\0\0\0\0\0" > inputPipe
    fi
  done < outputPipe
trap "rm -f inputPipe outputPipe" EXIT
trap "kill -9 $pid1 $pid2 $pid3" EXIT
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Antes de proceder a la implementación, es importante entender el concepto de respuesta del servidor TCP. Cuando un cliente envía una solicitud a un servidor TCP, el servidor envía una respuesta de vuelta al cliente. Esta respuesta puede capturarse e imprimirse en la terminal utilizando varios métodos como tuberías, sockets, etc.

    En este caso particular, la solución implica crear dos tuberías tipo fifo, inputPipe y outputPipe. La inputPipe se utiliza para enviar solicitudes al servidor TCP, mientras que la respuesta del servidor se captura en la outputPipe.

    El código involucra algunos pasos, que se explican a continuación:

    1. Crear inputPipe y outputPipe: El primer paso es crear las dos tuberías tipo fifo utilizando el comando mkfifo. Esto asegura que cualquier dato escrito en inputPipe se envíe automáticamente al servidor TCP, y cualquier respuesta del servidor se capture automáticamente en outputPipe.
    rm -f inputPipe
        mkfifo inputPipe
        rm -f outputPipe
        mkfifo outputPipe
    
    1. Abrir las tuberías: El siguiente paso es abrir las tuberías utilizando dos comandos Perl. Estos comandos mantienen las tuberías abiertas durante una hora (3600 segundos).
    perl -e 'open(my $fh, ">", "inputPipe"); sleep 3600 while 1' &
        pid1=$!
        perl -e 'open(my $fh, ">", "outputPipe"); sleep 3600 while 1' &
        pid2=$!
    
    1. Enviar solicitudes al servidor TCP: El comando cat se utiliza para enviar solicitudes al servidor TCP. Lee datos de inputPipe y los envía al servidor TCP utilizando el comando nc (netcat).
    cat inputPipe | nc -v 192.168.1.105 19204 > outputPipe &
        pid3=$!
    
    1. Capturar respuesta del servidor TCP: La respuesta del servidor TCP se captura en outputPipe utilizando un bucle while. El comando read se utiliza para leer cada línea de la respuesta. Sin embargo, aquí hay un problema: la respuesta del servidor puede no contener ningún carácter de fin de línea, lo que hace que el comando read se cuelgue indefinidamente.
    while true; 
      do 
        if read line; 
        then 
          echo $line;
          sleep 2;
          echo -e "\x5A\x01\0\x01\0\0\0\x1C\x05\x15\0\0\0\0\0\0" > inputPipe
        fi 
      done <outputpipe ```="" para="" resolver="" este="" problema,="" es="" necesario="" utilizar="" un="" método="" diferente="" para="" capturar="" la="" respuesta.="" una="" opción="" es="" utilizar="" el="" comando="" nc="" con="" la="" opción="" -k="" (keepalive),="" que="" asegurará="" que="" la="" conexión="" con="" el="" servidor="" permanezca="" abierta="" y="" que="" la="" respuesta="" se="" captura="" continuamente="" en="" outputpipe.="" ```="" nc="" -k="" -v="" 192.168.1.105="" 19204="" <="" inputpipe=""> outputPipe &
        pid3=$!
    

    Esto asegurará que cualquier respuesta del servidor TCP se capture inmediatamente en outputPipe y pueda leerse utilizando el comando read sin problemas.

    Por último, se utiliza el comando trap para eliminar las tuberías y finalizar los procesos de Perl y nc al salir.

    trap "rm -f inputPipe outputPipe" EXIT
    trap "kill -9 $pid1 $pid2 $pid3" EXIT

Comments are closed.