TCP bağlantısı için içeri / dışarı adlandırılmış yöneltmeler kullanma


15

Bunu bir süredir işe almakla uğraşıyorum, bu yüzden boruların nasıl çalıştığına dair bir tür temel yanlış anlaşılmanın sıkıntılarımın temel nedeni olduğundan şüpheleniyorum.

Amacım, uzak bir ana bilgisayara TCP bağlantısı başlatmak netcatve dosya sisteminde iki adlandırılmış yönteme sahip olmak: Biri gelen verileri almak için süreçlerin okuyabileceği ve diğerlerinin giden veri olarak hizmet verebileceği süreçler. Şu anda aşağıdaki yapıyı kullanıyorum:

mkfifo in
mkfifo out
cat out | netcat foo.bar.org 4000 > in &

Buradan, diğer işlemlerin bu açık TCP bağlantısına okuma / yazma izni vermek istiyorum. Bu "sadece işe yaramalı" mı yoksa böyle bir yapının işe yaramamasının bir nedeni var mı?

Ne görünüyor anda gerçekleşmesi ben okuma olmasıdır outsorun olmadan, ama ben yazarken inben çıktı ölü olarak bir kırık boru ve sonraki tüm iletişim görünür söz olsun. Düşünceler?

(İlgili: Başlangıçta kullandım:

netcat foo.bar.org 4000 < out > in &

ancak girişi beklemeyi engellediğini tespit etti. Bunu da merak ediyorum, ancak muhtemelen ayrı bir soruda ele alınmalıdır.)

Yanıtlar:


6
cat out | netcat foo.bar.org 4000 > in &

Bence sorun, caten kısa süredeEOF gelen outboru. Ve catçıkışlarda, boru hattının geri kalanı (dahil netcat) de sonlandırılır.

Bunun yerine böyle bir şey deneyin:

while true; do cat out; done | netcat foo.bar.org 4000 > in &

Böylece, catgerektiği kadar sık ​​yeniden başlatılır EOFve outboruda görünen tüm borular etkin bir şekilde kullanılır.


Bunu denedim, ama yine write(stdout): Broken pipede outboruya yazdıktan sonra (veya kısa bir süre sonra) alıyorum .
noffle

2

Ben de bu sorunla karşılaşmıştım. Temel sorun netcat. Harika bir araçtır, ancak bağlı giriş veya çıkış dosyası tanımlayıcılarından biri kapatıldığında bağlantıyı kapatır. Sunucu dinlemediğinde hiçbir şey yapmaz ve diğer eş kapatıldığında çıkar. Sunucuyu doğru şekilde kurduğunuz ve dosya tanımlayıcılarınızı açık tuttuğunuz sürece çalışır. Örneğin, aşağıdaki senaryoyu test ettim ve çok iyi çalıştı: bir terminal kurulumunda bir yankı sunucusu (aşağıdaki gibi ayarladım):

mkfifo loopFF
netcat -t -l -p 4000 <loopFF | tee loopFF

şimdi başka bir terminalde sunucunuzla fifo bağlantınızı kurun:

mkfifo in
mkfifo out
netcat 127.0.0.1 4000 <out >in &

sunucunun size gönderdiği her şeyi yazdırın (ve insonlandırmanın bir ucunu kapatan bir uygulamada fifo kullanırsanız netcat, bağlantıyı kapatır)

cat in &

ve aynı terminalde:

cat > out

şimdi yazdığınız her şey tekrar yazdırılacaktır (Enter tuşuna bastıktan sonra). Bu komutun kapatılması bağlantıyı da kapatır.


Kendim denediğimde durum böyle netcat -t -l -p 4000 < loopFF | tee loopFFdeğil , ama neden kendisiyle sonsuz bir geri besleme döngüsüne neden olmuyor ?
noffle

@noffle, çünkü dediğim gibi netcat, ağ bağlantılarından biri her kapatıldığında kapanacak. İstemciyi kapatırsanız (bir dize gönderir ve aynı dizeyi alırsa), netcatsunucu da kapatılır. Bu durumda kendim için bir sunucu kodu yazdım, bu da kendisini birden çok istemciyi işlemeye ve istemcileri yeniden bağlamaya zorlar.
saeedn

2

Steven Monday'in analizi bana iyi geliyor: fifo olduğu catiçin ilk yazmanızdan sonra geri dönüyor . Bundan kaçınmak için çözüm, fifo yazma modunda açıldığında , aşağıdaki örnekteki ilk işlem olan bir işlem tutmaktır :outemptycat

mkfifo in
mkfifo out
cat > out &
echo $! > out-pid
cat out | netcat foo.bar.org 4000 > in &

(Out-pid dosyası her şeyi durdurmanın yoludur:. kill -9 $(cat out-pid))

Burada başka bir örnek .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.