मुझे लगता है कि यह linux के करीब है - Netcat UDP ट्रैफ़िक के लिए सुनना बंद कर देता है - सुपर उपयोगकर्ता , लेकिन मैंने सोचा कि मैं किसी भी रास्ते से पूछना चाहता हूं
नेटकाट के संस्करणों में जहां तक मैं उबंटू 11.04 और उस netcatपर डिफ़ॉल्ट का उपयोग कर रहा हूं , जिसका मैं अनुमान लगा रहा हूं openbsd:
$ nc
This is nc from the netcat-openbsd package. An alternative nc is available
in the netcat-traditional package.
usage: nc [-46DdhklnrStUuvzC] [-i interval] [-P proxy_username] [-p source_port]
[-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_protocol]
[-x proxy_address[:port]] [hostname] [port[s]]
यह वह है जो मुझे अजीब लगता है: पहला मामला उम्मीद के मुताबिक काम करता है - मैं एक टर्मिनल में एक यूडीपी सर्वर खोलता हूं:
$ sudo nc -ul 5000
... और एक अन्य टर्मिनल में मैं एक नया यूडीपी क्लाइंट कनेक्शन शुरू करता हूं - और मैं helloतीन बार टाइप करता हूं , प्रत्येक के बाद ENTER दबाता हूं :
$ nc -u 127.0.0.1 5000
hello
hello
hello
^C
... और सर्वर टर्मिनल पर वापस जा रहा है, यह helloतीन बार मुद्रित किया गया है, जैसा कि अपेक्षित है:
$ sudo nc -ul 5000
hello
hello
hello
^C
अब तक बहुत अच्छा, सभी उम्मीद के मुताबिक काम करते हैं। हालाँकि, मान लीजिए कि मैं क्लाइंट में इनपुट पाइपिंग द्वारा समान कोशिश करता हूं; इसलिए पहले टर्मिनल में एक UDP सर्वर स्थापित करें:
$ sudo nc -ul 5000
... और दूसरे में, ncUDP क्लाइंट के रूप में कुछ डेटा को पाइप करें:
$ echo hello | nc -u 127.0.0.1 5000
hello
hello
^C
... क्लाइंट कमांड के बाद, शेल की तरह फ्रीज होता है जैसे कि इनपुट का इंतजार कर रहा है - इसलिए मैं helloदो बार और टाइप करता हूं ; लेकिन सर्वर ने केवल पहला पंजीकृत किया है hello(जो कि इसके माध्यम से पाइप किया गया था echo)। इसके अलावा, यहां तक कि अगर आप Ctrl-C दबाते हैं, और क्लाइंट echo hello | nc -u 127.0.0.1 5000कमांड को दोहराने की कोशिश करते हैं , तो सर्वर अभी भी बहुत पहले रिपोर्ट किया जाएगा hello:
$ sudo nc -ul 57130
hello
^C
... और केवल Ctrl-C के साथ सर्वर को रोकने और इसे फिर से शुरू करने के बाद, ग्राहक echo hello | nc -u 127.0.0.1 5000आदेश को दोहरा सकता है और इसे काम कर सकता है।
क्या यह तरीका ncव्यवहार करने वाला है? मुझे उम्मीद है कि कम से कम बार-बार कॉल करने के echo hello | nc -u 127.0.0.1 5000लिए पंजीकृत किया जाएगा - सर्वर को पुनरारंभ किए बिना? या शायद उस तरह के व्यवहार के लिए एक विशेष कमांड-लाइन स्विच है?
संपादित करें: मुझे यह अच्छी पीडीएफ प्रस्तुति मिली: समाज - सभी प्रकार के सॉकेट्स को संभालना , जिसमें निम्नलिखित netcatबनाम socatनोट शामिल हैं:
netcat - सीमाएँ
● केवल एक शॉट (सॉकेट बंद होने के बाद समाप्त होता है)
...
उदाहरण 1: netcat रिप्लेसमेंट
...
● UDP क्लाइंट सोर्स पोर्ट के साथ:
nc -u 500 1.2.3.4 500
समाज - udp: 1.2.3.4: 500, sp = 500
● TCP सर्वर:
nc -l -p 8080
socat - tcp-l: 8080, reuseaddr
...
... हालाँकि, मैं ऊपर के समान व्यवहार कर रहा हूं, अगर मैं सर्वर कमांड को socat - udp4-listen:5000,reuseaddr"-" और क्लाइंट लाइन को " socat - udp:127.0.0.1:5000" ... पाइप्ड इनपुट के साथ, " echo hello | socat - udp:127.0.0.1:5000" के साथ बदल देता हूं, तो एकमात्र अंतर यह है कि यहाँ शब्द helloभेजे जाने के बाद कमांड कम से कम मौजूद है - हालाँकि, फिर से, इस कमांड के लगातार रन सर्वर पर किसी भी रिसेप्शन का कारण नहीं होगा, जब तक कि सर्वर को फिर से शुरू नहीं किया जाता है।
cat $(echo -e "hello\nhello\nhello\n" > tmpf; echo tmpf) | nc -u 127.0.0.1 5000"), हालांकि, जब मैं तीनhelloएस देखता हूं, तो मुझे कौन सी पहेलियां अभी भी मौजूद हैं: वह आदेश भी "लॉक" की तरह होगा, जैसे कि टाइप किए गए इनपुट का इंतजार करना उपयोगकर्ता, और Ctrl-C के बाद और इसे पुनः चालू करने के बाद, सर्वर को पुनः आरंभ होने तक कोई डेटा दिखाई नहीं देगा !? यही तो मैं बेहतर जानना चाहता हूँ - चीयर्स!