
Quiero leer los datos que llegan a un puerto TCP específico de forma indefinida y volcarlos en un archivo. He probado muchas variaciones diferentes nc
pero no me funciona. En su mayor parte no recibo ningún error en la consola. A continuación se muestra lo que he probado:
nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile
Aprecio tu ayuda..
Respuesta1
Quiero leer los datos que llegan a un puerto TCP específico de forma indefinida.
Esto realmente no tiene sentido... si lo que buscaba era que todos los datos llegaran a un puerto UDP, entonces está bien; sin embargo, TCP es un protocolo basado en conexión. Una vez que un cliente se conecta y usted accept()
termina con dos sockets: uno escuchando y otro conectado al cliente... nc
cerrará el socket de escucha original y tratará uno a uno con el cliente.
Si desea poder escuchar la conexión de varios clientes, intente usar socat
:
socat TCP-LISTEN:12345,fork FD:1 >> ../myfile
Esto configurará un conector de escucha y bifurcará un nuevo proceso en la conexión, manteniendo el conector de escucha escuchando. Todos los datos recibidos se escribirán en stdout (descriptor de archivo 1
), al que se redirige ../myfile
para agregarlo.
NOTA: los datos se recibirán de cualquier número de clientes, sin ningún orden garantizado y sin marcos... es decir: será un desastre de datos mezclados si tiene más de un cliente a la vez.
Si desea socat
manejar el archivo por usted, puede usar uno de CREATE
o OPEN
(consulte lapágina de manual):
socat TCP-LISTEN:12345,fork OPEN:../myfile,append
Si estás contento con un "un cliente a la vez"acercarse, luego poner nc
en un bucle:
while :; do nc -l 12345; done >> ../myfile
Pruebe esto con nc
:
nc localhost 12345
Respuesta2
la pantalla de la izquierda
nc -l 1234
inicia el servidor.
La pantalla de la derecha nc 127.0.0.1 1234
se conecta.
Parece que te equivocaste con tus comandos.
Vale la pena saber también si estás usando el gnu o el bsd, el mío es el bsd. man nc muestra "NC(1) Manual de comandos generales BSD". Para iniciar el servidor en gnu, es posible que necesite -l con -p. Para conectar el cliente al servidor en cualquier puerto, nunca usará -p.
Puedes usar -v también
Su problema inmediato fue que no lo estaba ejecutando en absoluto.
Su pregunta es si es indefinido, y debo señalar que si hace Ctrl-c en el lado del cliente, además de interrumpir la conexión, detiene el servidor. Puedes poner ese servidor escuchando en un bucle. Eso funciona. Entonces el servidor continúa escuchando y todavía está allí si intenta conectarse nuevamente después de presionar Ctrl-c del cliente.