Ich möchte die Daten, die auf einem bestimmten TCP-Port eingehen, unbegrenzt lesen und in eine Datei schreiben. Ich habe viele verschiedene Varianten ausprobiert, nc
aber es funktioniert bei mir nicht. Meistens erhalte ich keine Fehlermeldung auf der Konsole. Folgendes habe ich versucht:
nc -lv 12345 >> ../myfile
nc -v 12345 >> ../myfile
nc -v -p 12345 >> ../myfile
nc -v localhost -p 12345 >> ../myfile
Schätze deine Hilfe..
Antwort1
Ich möchte die Daten, die auf einem bestimmten TCP-Port ankommen, auf unbestimmte Zeit lesen
Das ergibt nicht wirklich Sinn... wenn Sie alle Daten über einen UDP-Port empfangen wollten, ist das in Ordnung - TCP ist jedoch ein verbindungsbasiertes Protokoll. Sobald ein Client eine Verbindung herstellt und Sie accept()
, haben Sie zwei Sockets - einen, der zuhört, und einen, der mit dem Client verbunden ist... nc
schließt den ursprünglichen, zuhörenden Socket und kümmert sich eins zu eins um den Client.
Wenn Sie auf die Verbindung mehrerer Clients warten möchten, versuchen Sie es mit folgendem socat
:
socat TCP-LISTEN:12345,fork FD:1 >> ../myfile
Dadurch wird ein Listening-Socket eingerichtet und bei der Verbindung ein neuer Prozess gestartet, wobei der Listening-Socket weiterhin lauscht. Alle empfangenen Daten werden in stdout (Dateideskriptor 1
) geschrieben, wohin sie ../myfile
zum Anhängen umgeleitet werden.
NOTIZ: Daten werden von einer beliebigen Anzahl von Clients empfangen, in keiner garantierten Reihenfolge und ohne Rahmen ... d. h.: Es entsteht ein Durcheinander von Daten, wenn Sie mehr als einen Client gleichzeitig haben.
Wenn Sie socat
die Datei für sich selbst verwalten möchten, können Sie einen von CREATE
oder verwenden OPEN
(siehemanpage):
socat TCP-LISTEN:12345,fork OPEN:../myfile,append
Wenn Sie zufrieden sind mit einem "ein Kunde nach dem anderen" Ansatz, dann nc
in eine Schleife einfügen:
while :; do nc -l 12345; done >> ../myfile
Testen Sie dies mit nc
:
nc localhost 12345
Antwort2
der Bildschirm links
nc -l 1234
startet den Server.
der Bildschirm rechts nc 127.0.0.1 1234
stellt die Verbindung her.
es sieht so aus, als hätten Sie Ihre Befehle falsch verstanden.
Es ist auch wichtig zu wissen, ob Sie die GNU- oder BSD-Version verwenden. Meine ist die BSD-Version. man nc zeigt „NC(1) BSD General Commands Manual“. Um den Server auf der GNU-Version zu starten, ist möglicherweise -l mit -p erforderlich. Um den Client über einen beliebigen Port mit dem Server zu verbinden, wird niemals -p verwendet.
Sie können auch -v verwenden
Ihr unmittelbares Problem war, dass Sie es überhaupt nicht zum Laufen bekamen.
Ihre Frage bezieht sich auf die Unbefristung, und ich möchte jedoch anmerken, dass, wenn Sie auf der Clientseite Strg+C drücken, nicht nur die Verbindung unterbrochen wird, sondern auch der Server gestoppt wird. Sie können den Server in eine Schleife versetzen, in der er lauscht. Das funktioniert. Der Server hört dann weiter zu und ist immer noch da, wenn Sie nach Strg+C vom Client aus erneut versuchen, eine Verbindung herzustellen.