Menggunakan pipa bernama masuk / keluar untuk koneksi TCP

15

Saya telah mengutak-atik agar ini berfungsi untuk sementara waktu sekarang, jadi saya curiga ada semacam kesalahpahaman mendasar tentang bagaimana pipa bekerja adalah akar penyebab masalah saya.

Tujuan saya adalah untuk memulai koneksi TCP ke beberapa host jarak jauh melalui netcatdan memiliki dua pipa bernama pada sistem file: satu yang proses dapat membaca dari untuk mendapatkan data yang masuk, dan yang lain proses yang dapat menulis ke yang berfungsi sebagai data keluar. Saat ini saya menggunakan konstruksi berikut:

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

Dari sini, saya ingin mengizinkan proses lain untuk membaca dan menulis ke / dari koneksi TCP terbuka ini. Haruskah ini "hanya bekerja", atau adakah alasan mengapa konstruk seperti ini tidak berhasil?

Apa yang tampaknya terjadi saat ini adalah bahwa saya dapat membaca dari outtanpa masalah, tetapi ketika saya menulis ke insaya mendapatkan output menyebutkan pipa yang rusak dan semua komunikasi berikutnya tampaknya mati. Pikiran?

(Terkait: Saya awalnya menggunakan:

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

tetapi menemukannya untuk memblokir menunggu input. Saya ingin tahu tentang ini juga, tetapi mungkin lebih baik dibahas dalam pertanyaan terpisah.)

noffle
sumber

Jawaban:

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

Saya pikir masalahnya adalah bahwa catakan keluar segera setelah menerima EOFdari outpipa. Dan ketika catkeluar, sisa pipa (termasuk netcat) akan diakhiri juga.

Coba sesuatu seperti ini sebagai gantinya:

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

Dengan demikian, catdinyalakan kembali sesering yang diperlukan, dan semua EOFyang muncul dalam outpipa ditangani secara efektif.

Steven Monday
sumber
Saya mencoba ini, tetapi masih menerima write(stdout): Broken pipesetelah (atau tidak lama) menulis ke outpipa.
noffle
2

Saya juga menghadapi masalah ini. Masalah utamanya adalah netcat. Ini adalah alat yang hebat, tetapi menutup koneksi ketika salah satu dari input atau output file deskriptornya ditutup. Itu tidak melakukan apa-apa ketika server tidak mendengarkan dan keluar ketika rekan lain ditutup. Selama Anda mengatur server dengan benar dan menjaga deskriptor file Anda tetap terbuka, itu akan berfungsi. Sebagai contoh saya menguji skenario berikut dan itu bekerja dengan sangat baik: dalam pengaturan terminal server gema (saya atur seperti di bawah ini):

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

sekarang di terminal lain atur koneksi fifo Anda ke server Anda:

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

cetak server apa pun yang mengirim kepada Anda (dan tetap jalankan, jika Anda menggunakan infifo dalam aplikasi yang menutup salah satu ujungnya pada penghentiannya, netcattutup koneksi)

cat in &

dan di terminal yang sama:

cat > out

sekarang apa pun yang Anda ketik akan dicetak lagi (setelah menekan Enter). Menutup perintah ini juga akan menutup koneksi.

Saeedn
sumber
Saya dapat melihat bahwa ini tidak terjadi ketika saya mencobanya sendiri, tetapi mengapa netcat -t -l -p 4000 < loopFF | tee loopFFtidak menyebabkan loop umpan balik yang tak terbatas dengan dirinya sendiri?
noffle
@noffle karena, seperti yang saya katakan, netcatakan menutup setiap kali salah satu koneksi jaringannya ditutup. Jika Anda menutup klien (yang mengirim string dan menerima string yang sama), netcatserver juga akan ditutup. Saya menulis kode server untuk diri saya sendiri dalam hal ini yang bercabang sendiri untuk menangani banyak klien dan menghubungkan kembali klien.
saeedn
2

Analisis Steven Monday terlihat bagus bagi saya: catkembali setelah penulisan pertama Anda outkarena fifo-nya empty. Untuk menghindari itu, solusinya adalah menjaga proses dengan fifo dibuka dalam mode tulis, yang pertama catdalam contoh di bawah ini:

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

(File out-pid adalah cara untuk menghentikan semuanya:. kill -9 $(cat out-pid))

Contoh lain di sini .

jfg956
sumber