2013-03-31 6 views
9

तो, बहुत ही सरल कोड है कि मैं का उपयोग करने के कोशिश कर रहा हूँ यहाँ है: http://wiki.python.org/moin/UdpCommunicationसरल अजगर यूडीपी सर्वर: मुसीबत स्थानीय होस्ट के अलावा अन्य ग्राहकों से पैकेट प्राप्त करने

(भी यहाँ): भेजा जा रहा है:

import socket 
UDP_IP = "127.0.0.1" 
UDP_PORT = 5005 
MESSAGE = "Hello, World!" 

print "UDP target IP:", UDP_IP 
print "UDP target port:", UDP_PORT 
print "message:", MESSAGE 

sock = socket.socket(socket.AF_INET, # Internet 
       socket.SOCK_DGRAM) # UDP 
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 

प्राप्त: जब मैं अपने कंप्यूटर पर दोनों अनुप्रयोगों को चलाने

import socket 

UDP_IP = "127.0.0.1" 
UDP_PORT = 5005 

sock = socket.socket(socket.AF_INET, # Internet 
       socket.SOCK_DGRAM) # UDP 
sock.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes 
    print "received message:", data 

कोड ठीक काम करता है। मैंने अपने लैपटॉप पर प्रेषण कोड डाल दिया:

UDP_IP="IP address for my computer" 

बाकी सब कुछ वही है। फिर भी, कुछ भी नहीं होता है। मैं गलत तरीके से क्या कर रहा हूँ? मैंने वायरशर्क का इस्तेमाल किया और यह निर्धारित किया कि पैकेट भेजा और प्राप्त किया जा रहा है; हालांकि, अजगर कार्यक्रम पैकेट प्राप्त नहीं कर रहा है। मैं बड़ी उलझन में हूं।

किसी भी मदद की बहुत सराहना की जाती है। अग्रिम धन्यवाद। जब यूडीपी पैकेट प्राप्त करने के लिए बाध्य करने के मामले में

sock.bind(("", UDP_PORT)) # could also use "0.0.0.0" 

ध्यान दें कि ऑपरेटिंग सिस्टम के व्यवहार पूरी तरह से तार्किक (और न ही संगत) नहीं है, विशेष रूप से बहुस्त्र्पीय यातायात के लिए:

उत्तर

13

प्राप्त पक्ष पर सभी स्थानीय इंटरफेस के लिए बाध्य करने का प्रयास करें ।

लिनक्स: किसी विशिष्ट IP के लिए बाइंडिंग जाएगा फिल्टर भेजे यूडीपी पैकेट और केवल लोगों को इस विशिष्ट IP पर लक्षित फिल्टर के माध्यम से मिल जाएगा यह व्यवहार आप प्राप्त है। इसका अर्थ यह है कि आईपी 1 9 2.168.1.100 के साथ इंटरफ़ेस द्वारा प्राप्त मल्टीकास्ट यूडीपी पैकेट प्राप्त नहीं होंगे जब आईपी 1 9 2.168.1.100 पर बाध्यकारी हो। लिनक्स पर सामान्य बांध एक इंटरफेस से बंधे नहीं है। इसके लिए सेटॉकॉप (SO_BINDTODEVICE) का उपयोग करें। 0.0.0.0 (या "" पायथन पर) बाध्यकारी हमेशा गंतव्य आईपी के बावजूद मशीन द्वारा प्राप्त सभी यूडीपी पैकेट प्राप्त करेगा, इसलिए यह आमतौर पर लिनक्स पर सबसे उपयोगी विकल्प है।

विंडोज़: एक विशिष्ट आईपी के लिए बाध्यकारी इस आईपी से जुड़े इंटरफ़ेस से जुड़ जाएगा, लिनक्स पर सेटॉकॉप (SO_BINDTODEVICE) की तरह बहुत कुछ है। आने वाले यूडीपी पैकेट को इस आईपी द्वारा फ़िल्टर नहीं किया जाता है, इसलिए कंक्रीट आईपी पर बाध्यकारी होने पर भी मल्टीकास्ट ट्रैफिक प्राप्त किया जा सकता है। (यह शायद पहली बार विंडोज व्यवहार लिनक्स व्यवहार से मेरे लिए और अधिक सुसंगत लगता है।)

अजगर सॉकेट के लिए दूर नहीं सार इन ओएस विशिष्ट मतभेद करता है (के रूप में यह अन्य क्षेत्रों में करता है)। जब तक आपके पास ऐसा करने का कोई स्पष्ट कारण नहीं है, तब तक मैं हमेशा 0.0.0.0 से जुड़ने का सुझाव देता हूं।

+0

आपके उत्तर के लिए धन्यवाद। Socket.INADDR_ANY को छोड़कर प्रत्येक विकल्प ने कुछ भी नहीं किया, और socket.INADDR_ANY ने एक त्रुटि दी और कहा कि यह एक int पाया गया है, लेकिन एक स्ट्रिंग की उम्मीद है, इसलिए मैंने उपयोग किया: sock.bind ((str (socket.INADDR_ANY), UDP_PORT)), लेकिन यह उत्पादित: socket.gaierror: [Errno 11004] getaddrinfo विफल हुआ जब मैंने वास्तव में कनेक्ट करने का प्रयास किया। –

+0

हम्म, अजीब। मैं अभी विचारों से बाहर हूं ... –

+0

अरग, हाँ, सॉकेट .INADDR_ANY सिर्फ एक 'int' पर मैप किया गया है जो पाइथन 'सॉकेट' मॉड्यूल के साथ बेकार है। मैं जवाब से इसे हटा दूंगा। (बेशक यह आपकी समस्या का समाधान नहीं करता है।) –

0

सुनिश्चित करें कि recvfrom कॉल निष्पादित करने का प्रयास करते समय सर्वर पोर्ट खुला है। यदि गंतव्य बंदरगाह से सॉकेट पढ़ने नीचे था तो हमें यह त्रुटि मिलती है।

मैं एक ही त्रुटि मिली और इस लिंक को पढ़ कर तय - http://www.linuxsa.org.au/mailing-list/2001-04/668.html

-1

तो मैं एक संदेश भेजने और फिर कैसे होगा कोड नज़र एक प्रतिक्रिया प्राप्त करना चाहते हैं? इस कदर?

import socket 
UDP_IP = "127.0.0.1" 
UDP_PORT = 5005 
MESSAGE = "Hello, World!" 

sock = socket.socket(socket.AF_INET, # Internet 
       socket.SOCK_DGRAM) # UDP 
sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 

sock.bind((UDP_IP, UDP_PORT)) 

while True: 
    data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes 
    print "received message:", data 
4

eventually figured out my issue and it was pretty complex and highly localized,

मैं एक बहुत ही इसी तरह की समस्या मेरा क्या था।मुझे एहसास है कि आपने इस समस्या को हल कर लिया है, हालांकि मैंने सोचा कि यह साझा करना अच्छा होगा कि मैंने इस मुद्दे को कैसे हल किया।

मुझे मिली समस्या मेरे फ़ायरवॉल सेटिंग्स के साथ थी। मैंने पाया कि पैकेट को विंडोज फ़ायरवॉल द्वारा अवरुद्ध किया जा रहा था।

मैंने भी वायरशर्क का उपयोग किया था जो दिखाता है कि पैकेट भेजे और प्राप्त किए जा रहे थे। यह ध्यान रखना महत्वपूर्ण है कि वायरशर्क पाइथन एप्लिकेशन की तुलना में पैकेट को बहुत कम स्तर पर पकड़ लेता है।

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

फ़ायरवॉल नीति को बदलना इस समस्या को हल करता है। इस काम को करने के लिए फ़ायरवॉल को बदलने के कई तरीके और अंतर्निहित सुरक्षा जोखिम हैं इसलिए मैं उस भाग को आईटी पेशेवरों को छोड़ दूंगा। :-)

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