टीसीपी कनेक्शन के लिए नामित पाइपों का उपयोग करना


15

मैं इसे थोड़ी देर के लिए काम करने के लिए तैयार कर रहा हूं, इसलिए मुझे कुछ गलतफहमी है कि पाइप काम कैसे मेरी परेशानी का मूल कारण है।

मेरा लक्ष्य कुछ दूरस्थ होस्ट के माध्यम से टीसीपी कनेक्शन शुरू करना है netcatऔर फाइलसिस्टम पर दो नामित पाइप हैं: एक जो आने वाली डेटा प्राप्त करने के लिए प्रक्रियाओं को पढ़ सकता है, और अन्य जो प्रक्रियाएं आउटगोइंग डेटा के रूप में सेवा कर सकती हैं। मैं वर्तमान में निम्नलिखित निर्माण का उपयोग कर रहा हूं:

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

यहां से, मैं अन्य प्रक्रियाओं को इस खुले टीसीपी कनेक्शन को पढ़ने / लिखने की अनुमति देना चाहूंगा। क्या यह "बस काम" होना चाहिए, या क्या कोई कारण है कि इस तरह का निर्माण काम नहीं कर सकता है?

क्या लगता है वर्तमान में होने की है कि मैं से पढ़ सकते हैं outइस मुद्दे के बिना, लेकिन जब मैं करने के लिए लिख inरहा उत्पादन एक टूट पाइप और बाद के सभी संचार प्रकट होता है उल्लेख मृत होने का मिलता है। विचार?

(संबंधित: मैं मूल रूप से इस्तेमाल किया:

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

लेकिन इसे इनपुट के इंतजार में ब्लॉक करना पाया। मैं इसके बारे में उत्सुक हूं, लेकिन यह शायद एक अलग प्रश्न में बेहतर है।)

जवाबों:


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

मुझे लगता है कि यह समस्या पाइप से catप्राप्त होते ही बाहर निकल जाएगी । और जब बाहर निकलता है, तो बाकी पाइपलाइन (सहित ) भी समाप्त हो जाती है।EOFoutcatnetcat

इसके बजाय कुछ इस तरह आज़माएँ:

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

इस प्रकार, catजितनी बार जरूरत होती है, उतनी बार फिर से शुरू हो जाता है, और पाइप EOFमें दिखने वाले किसी भी एस outको प्रभावी ढंग से नियंत्रित किया जाता है।


मैंने यह कोशिश की, लेकिन फिर भी पाइप write(stdout): Broken pipeको लिखने के बाद (या थोड़ी देर बाद) प्राप्त करें out
noffle

2

मुझे इस समस्या का भी सामना करना पड़ा। मुख्य समस्या है netcat। यह एक महान उपकरण है, लेकिन यह कनेक्शन को बंद कर देता है जब इसके जुड़े इनपुट या आउटपुट फ़ाइल डिस्क्रिप्टर में से एक बंद हो जाता है। जब सर्वर नहीं सुन रहा होता है तो यह कुछ नहीं करता है और जब दूसरा सहकर्मी बंद होता है तो यह बाहर निकलता है। जब तक आप सर्वर को सही ढंग से सेटअप करते हैं और अपनी फ़ाइल डिस्क्रिप्टर को खुला रखते हैं, तब तक यह काम करेगा। उदाहरण के लिए मैंने निम्नलिखित परिदृश्य का परीक्षण किया और यह बहुत अच्छी तरह से काम किया: एक टर्मिनल सेटअप में एक इको सर्वर (मैंने इसे नीचे की तरह सेट किया है):

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

अब किसी अन्य टर्मिनल सेटअप में अपने सर्वर के लिए आपका पांचो कनेक्शन:

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

जो भी सर्वर आपको भेजता है उसे प्रिंट करें (और इसे चालू रखें, यदि आप inकिसी एप्लिकेशन में पेंडो का उपयोग करते हैं जो अपने समाप्ति पर एक छोर को netcatबंद कर देता है, तो कनेक्शन बंद कर देता है)

cat in &

और एक ही टर्मिनल में:

cat > out

अब आप जो भी टाइप करेंगे उसे फिर से प्रिंट किया जाएगा (एंटर मारने के बाद)। इस कमांड को बंद करने से कनेक्शन भी बंद हो जाएगा।


मैं देख सकता हूं कि जब मैं खुद इसे आजमाता हूं, तो ऐसा netcat -t -l -p 4000 < loopFF | tee loopFFनहीं होता, लेकिन अपने साथ अनंत प्रतिक्रिया पाश क्यों नहीं होता?
noffle

@noffle क्योंकि, जैसा कि मैंने कहा, netcatजब भी इसका एक नेटवर्क कनेक्शन बंद होगा। यदि आप क्लाइंट को बंद करते हैं (जो एक स्ट्रिंग भेजता है और उसी स्ट्रिंग को प्राप्त करता है), netcatसर्वर भी बंद हो जाएगा। मैंने इस मामले में अपने लिए एक सर्वर कोड लिखा है जो कई क्लाइंट्स को संभालने और क्लाइंट्स को फिर से जोड़ने के लिए खुद को फोर्क्स करता है।
सईद

2

स्टीवन मंडे का विश्लेषण मुझे अच्छा लग रहा है: catआपके 1 लिखने के बाद रिटर्न outक्योंकि फेनो है empty। इससे बचने के लिए, समाधान एक प्रक्रिया को लिखित मोड में खोलने के साथ रखना है, catउदाहरण बलो में 1 :

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

(बाहर पीआईडी फ़ाइल रास्ता पूरी बात को रोकने के लिए है: kill -9 $(cat out-pid)।)

एक और उदाहरण यहाँ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.