2010-01-25 16 views
8

मेरे पास कई धागे के साथ एक अजगर प्रोग्राम है। मैं सॉकेट बनाने की सोच रहा था, इसे स्थानीयहोस्ट से बांधता हूं, और इस केंद्रीय स्थान पर धागे पढ़ते/लिखते हैं। हालांकि मैं नहीं चाहता कि यह सॉकेट शेष नेटवर्क के लिए खुला हो, बस 127.0.0.1 से कनेक्शन स्वीकार किए जाने चाहिए। मैं यह कैसे करूं (पायथन में)? और यह एक उपयुक्त डिजाइन है? या क्या कुछ और अधिक सुरुचिपूर्ण है?स्थानीयहोस्ट कनेक्शन तक सीमित सॉकेट बनाना केवल

उत्तर

0

यदि आप sock.bind ((पोर्ट, '127.0.0.1') करते हैं तो यह केवल स्थानीयहोस्ट पर सुनेंगे, न कि अन्य इंटरफेस पर, इसलिए आपको बस इतना ही चाहिए।

6

सॉकेट socket.socket() के साथ बनाया को देखते हुए, तो आप सुनना से पहले bind() उपयोग कर सकते हैं:

socket.bind(('127.0.0.1', 80)) 

पता 127.0.0.1 का प्रयोग इंगित करता है कि सॉकेट केवल स्थानीय इंटरफ़ेस से आबद्ध चाहिए।

+0

क्या यह 'INADDR_ANY' से जुड़ा नहीं है? –

+0

http://www.amk.ca/python/howto/sockets/ के अनुसार नहीं, हालांकि वास्तविक पायथन दस्तावेज़ बताता है कि '' '' 'INADDR_ANY' के बराबर है। मैं अपना जवाब अपडेट करूंगा। –

+1

यह INADDR_ANY से जुड़ा हुआ है यदि आप इसे बताते हैं (एक मेजबान की कल्पना करके) '। '127.0.0.1' का एक मेजबान निर्दिष्ट करना इसे 127.0.0.1 – nos

5

http://www.amk.ca/python/howto/sockets/

कुछ सॉकेट उदाहरण दिखाता है। यह टिडबिट आपके लिए दिलचस्प है मुझे लगता है कि

हमने सॉकेट.gethostname() का उपयोग किया ताकि सॉकेट बाहरी दुनिया के लिए दिखाई दे। अगर हमने s.bind (('', 80)) या s.bind (('localhost', 80)) या s.bind (('127.0.0.1', 80) का उपयोग किया था) तो हमारे पास अभी भी "सर्वर" होगा "सॉकेट, लेकिन एक जो केवल उसी मशीन के भीतर दिखाई देता था।

मुझे लगता है कि वहाँ धागा संचार के लिए इस पद्धति का उपयोग की वैधता के रूप में अपने जवाब (सुधार लिए नीचे देखें)

है। मुझे यकीन है कि कैसे अच्छी तरह से इस/लेखन से अधिक थ्रेड और पढ़ने हैंडल नहीं कर रहा हूँ

संपादित

वहाँ एक अजगर नुस्खा है कि नीचे लिंक किए गए प्रतीत हो रहा है कुछ अंतर-धागा संचार

http://code.activestate.com/recipes/491281/

है मज़ा!

संपादित

लेख गलत है और के रूप में ने कहा कि "s.bind ((', 80)) INADDR_ANY करने के लिए बाध्य होगा"

+1

से जोड़ता है यह आलेख गलत है। एस। बाइंड (('', 80)) INADDR_ANY से जुड़ जाएंगे। – JimB

+0

इसके लिए धन्यवाद मैं – petantik

2

आप मानक से queue module उपयोग कर सकते हैं पुस्तकालय के बजाय। यह विशेष रूप से धागे के बीच संचार की सुविधा के लिए बनाया गया है। दस्तावेज़ों का उद्धरण:

कतार मॉड्यूल बहु-निर्माता, बहु-उपभोक्ता कतार लागू करता है। यह थ्रेड प्रोग्रामिंग में विशेष रूप से उपयोगी होता है जब जानकारी को कई धागे के बीच सुरक्षित रूप से आदान-प्रदान किया जाना चाहिए। इस मॉड्यूल में कतार वर्ग सभी आवश्यक लॉकिंग अर्थशास्त्र लागू करता है। यह पायथन में थ्रेड समर्थन की उपलब्धता पर निर्भर करता है; थ्रेडिंग मॉड्यूल देखें।

3

यदि आप यूनिक्स-आधारित सिस्टम पर चल रहे हैं, तो आप इंटरनेट सॉकेट के बजाय UNIX Domain Sockets का उपयोग करने पर विचार करना चाहेंगे।मुझे लगता है कि निम्नलिखित की तरह कुछ काम करना चाहिए:

>>> # in one window/shell 
>>> import socket 
>>> sd = socket.socket(socket.AF_UNIX) 
>>> sd.bind('/path/to/my/socket') 
>>> sd.listen(5) 
>>> (client,addr) = sd.accept() 
>>> client.recv(1024) 
'hello' 
>>> 

>>> # in a different shell 
>>> import socket 
>>> sd = socket.socket(socket.AF_UNIX) 
>>> sd.connect('/path/to/my/socket') 
>>> sd.send('hello') 
+0

को प्रतिबिंबित करने के लिए संपादित करूंगा लूपबैक डिवाइस पर एक टीसीपी/आईपी सॉकेट का उपयोग करना लाभ (या नुकसान, यदि आप करेंगे) है कि इसे उदाहरण के लिए एक एसएसएच सुरंग के माध्यम से पहुंचा जा सकता है। –

+1

एक यूनिक्स डोमेन सॉकेट एक ही कार्यक्षमता प्रदान करता है क्योंकि यह फ़ाइल सिस्टम से जुड़ा हुआ है। मैं उनकी ओर रुख करता हूं क्योंकि वे एक आईपी सॉकेट के रूप में संसाधन के रूप में भारी नहीं हैं। –

0

notionOn टीसीपी/आईपी नेटवर्क 127.0.0.0/8, एक गैर routeable नेटवर्क है ताकि आप एक आईपी आंकड़ारेख भर में 127.0.0.1 के लिए किस्मत में भेजने के लिए सक्षम नहीं होना चाहिए एक रूढ़िवादी आधारभूत संरचना। राउटर बस डेटाग्राम को त्याग देगा। हालांकि, 127.0.0.1 के गंतव्य पते के साथ डेटाग्राम बनाना और भेजना संभव है, इसलिए उसी होस्ट पर एक मेजबान (नेटवर्क की आईपी भावना) क्योंकि आपका होस्ट संभवतः आपके होस्ट के टीसीपी/आईपी स्टैक पर डेटाग्राम प्राप्त कर सकता है। यह वह जगह है जहां आपका स्थानीय फायरवाल खेल में आता है। आपके स्थानीय (होस्ट) फ़ायरवॉल में एक नियम होना चाहिए जो 127.0.0.0/8 के लिए निर्धारित आईपी डेटाग्राम को lo0 (या समकक्ष लूपबैक इंटरफ़ेस) के अलावा किसी भी इंटरफ़ेस में आना चाहिए। यदि आपका होस्ट या तो 1) ऐसे फ़ायरवॉल नियमों में जगह है या 2) अपने नेटवर्क पर मौजूद है (या केवल पूरी तरह से भरोसेमंद मेजबानों के साथ साझा किया गया है) और एक अच्छी तरह से कॉन्फ़िगर किए गए राउटर के पीछे, आप सुरक्षित रूप से केवल 127.0.0.1 से जुड़ सकते हैं और किसी भी निश्चित रूप से निश्चित हो सकते हैं सॉकेट पर प्राप्त डेटाग्राम स्थानीय मशीन से आए थे। पूर्व उत्तर पता चलता है कि 127.0.0.1 को कैसे खोलें और बाध्य करें।

संबंधित मुद्दे