Przez jakiś czas majstrowałem przy tym, żeby to zadziałało, więc podejrzewam jakieś podstawowe nieporozumienie na temat działania rur, które jest główną przyczyną moich problemów.
Moim celem jest zainicjowanie połączenia TCP z jakimś zdalnym hostem za pośrednictwem netcat
i posiadanie dwóch nazwanych potoków w systemie plików: jeden, z którego procesy mogą czytać, aby uzyskać przychodzące dane, a drugi, który procesy mogą zapisywać, służą jako dane wychodzące. Obecnie używam następującej konstrukcji:
mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &
Odtąd chciałbym zezwolić innym procesom na odczyt i zapis do / z tego otwartego połączenia TCP. Czy to „po prostu działa”, czy może jest powód, dla którego taki konstrukt nie może działać?
Co wydaje się stać w chwili obecnej jest to, że mogę odczytać z out
bez problemu, ale gdy piszę aby in
uzyskać wyjście wspomnieć o podziale rury i wszystkie kolejne pojawi komunikacyjnych być martwy. Myśli?
(Powiązane: pierwotnie użyłem:
netcat foo.bar.org 4000 < out > in &
ale stwierdził, że blokuje oczekiwanie na dane wejściowe. Ciekawi mnie to również, ale prawdopodobnie lepiej jest to rozwiązać w osobnym pytaniu).
write(stdout): Broken pipe
po (lub wkrótce po) pisaniu doout
potoku.Miałem też do czynienia z tym problemem. Głównym problemem jest
netcat
. To świetne narzędzie, ale zamyka połączenie, gdy jeden z podłączonych deskryptorów plików wejściowych lub wyjściowych jest zamknięty. Nie robi nic, gdy serwer nie nasłuchuje i kończy działanie, gdy drugi peer jest zamknięty. Tak długo, jak poprawnie skonfigurujesz serwer i utrzymasz otwarte deskryptory plików, będzie działać. Na przykład przetestowałem następujący scenariusz i działał bardzo dobrze: w konfiguracji terminalu serwer echa (ustawiłem go jak poniżej):teraz w innym terminalu skonfiguruj połączenie fifo z serwerem:
wydrukuj wszystko, co serwer ci wysyła (i utrzymuj, że działa, jeśli używasz
in
fifo w aplikacji, która zamyka jeden koniec po zakończeniu,netcat
zamyka połączenie)i na tym samym terminalu:
teraz cokolwiek wpiszesz, zostanie wydrukowane ponownie (po naciśnięciu Enter). Zamknięcie tego polecenia spowoduje również zamknięcie połączenia.
źródło
netcat -t -l -p 4000 < loopFF | tee loopFF
nie powoduje sam w sobie nieskończonej pętli sprzężenia zwrotnego?netcat
zostanie zamknięty za każdym razem, gdy jedno z jego połączeń sieciowych zostanie zamknięte. Jeśli zamkniesz klienta (który wysyła ciąg i odbiera ten sam ciąg),netcat
serwer również zostanie zamknięty. W tym przypadku napisałem dla siebie kod serwera, który każe sobie obsługiwać wielu klientów i łączyć się z nimi ponownie.Analiza Steven Monday wygląda dla mnie dobrze:
cat
wraca po pierwszym napisaniu do,out
ponieważ jest fifoempty
. Aby tego uniknąć, rozwiązaniem jest utrzymanie procesu z piątym otwartym w trybie zapisu, pierwszymcat
w poniższym przykładzie:(Plik out-pid jest sposobem na zatrzymanie całej sprawy:.
kill -9 $(cat out-pid)
)Kolejny przykład tutaj .
źródło