টিসিপি সংযোগের জন্য নামযুক্ত পাইপগুলি ইন / আউট ব্যবহার করা


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যত তাড়াতাড়ি এটা একটি পায় থেকে প্রস্থান করা হবে EOFথেকে outনল। এবং catপ্রস্থান করার সময়, বাকি পাইপলাইন (সহ netcat) সমাপ্ত হয়ে যায়।

পরিবর্তে এই জাতীয় কিছু চেষ্টা করুন:

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

সুতরাং, catপ্রয়োজন হিসাবে প্রায়শই পুনরায় EOFশুরু হয় এবং outপাইপে প্রদর্শিত যে কোনও গুলি কার্যকরভাবে পরিচালনা করা হয়।


আমি এই চেষ্টা করেছি, কিন্তু এখনও গ্রহণ write(stdout): Broken pipeপর (অথবা খুব শীঘ্রই পরে) লিখিতভাবে outনল।
নফলে

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না , তবে কেন নিজের সাথে অসীম প্রতিক্রিয়া লুপ সৃষ্টি করে না?
নফলে

@ অফল্য কারণ, যেমনটি আমি বলেছি, netcatযখনই এর কোনও নেটওয়ার্ক সংযোগ বন্ধ হবে তখনই বন্ধ হয়ে যাবে। আপনি যদি ক্লায়েন্টটি বন্ধ করেন (যা একটি স্ট্রিং প্রেরণ করে এবং একই স্ট্রিংটি গ্রহণ করে), netcatসার্ভারটিও বন্ধ হয়ে যাবে। আমি এক্ষেত্রে নিজের জন্য একটি সার্ভার কোড লিখেছি যা একাধিক ক্লায়েন্টকে পরিচালনা করতে এবং ক্লায়েন্টদের পুনরায় সংযোগ করতে বাধ্য করে।
সাইদেন

2

স্টিভেন সোমবারের বিশ্লেষণটি আমার কাছে ভাল দেখাচ্ছে: catআপনার 1 ম লেখার পরে outফিরো কারণ ফিফোটি empty। এটি এড়াতে সমাধানটি হ'ল লিখিত মোডে খোলা ফিফো দিয়ে একটি প্রক্রিয়া রাখা, উদাহরণের মধ্যে প্রথমটি হ'ল cat:

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

(আউট-পিড ফাইলটি পুরো জিনিসটি থামানোর উপায় kill -9 $(cat out-pid):))

এখানে আরও একটি উদাহরণ ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.