मुझे लगता है कि यह 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
... और दूसरे में, nc
UDP क्लाइंट के रूप में कुछ डेटा को पाइप करें:
$ 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 के बाद और इसे पुनः चालू करने के बाद, सर्वर को पुनः आरंभ होने तक कोई डेटा दिखाई नहीं देगा !? यही तो मैं बेहतर जानना चाहता हूँ - चीयर्स!