पर भेजने के लिए स्थानीय आईपी पता प्राप्त करें। मैं एक सर्वर पर यूडीपी पैकेट भेजने के लिए एक पायथन स्क्रिप्ट का उपयोग कर रहा हूं जो सर्वर से अधिसूचनाएं प्राप्त करने के लिए मेरी स्क्रिप्ट पंजीकृत करेगा। प्रोटोकॉल की आवश्यकता है कि मैं अपना स्वयं का आईपी पता और पोर्ट भेजूं जिस पर मैं इन सूचनाओं को प्राप्त करना चाहता हूं, इसलिए यह एक ऐसा पता होना चाहिए जो सर्वर के नेटवर्क से पहुंच योग्य हो।पायथन: आईपी डेटा को एक विशिष्ट रिमोट आईपी-एड्रेस
समाधान कम से कम विंडोज एक्सपी और ऊपर और अधिमानतः मैक ओएस एक्स पर काम करना चाहिए, क्योंकि यह मेरा विकास मंच है।
पहला कदम मेरे किसी भी इंटरफेस का आईपी पता प्राप्त करना है। मैं वर्तमान में मशीनों के अपने होस्ट नाम को हल करने के सामान्य रूप से सुझाए गए दृष्टिकोण का उपयोग कर रहा हूं:
def get_local_address():
return socket.gethostbyname(socket.gethostname())
यह कभी-कभी काम करता है। वर्तमान में यह 172.16.249.1
लौटाता है, जो वीएम वेयर द्वारा उपयोग किए जाने वाले वर्चुअल इंटरफ़ेस का पता है, इसलिए यह एक समस्या है।
डिफ़ॉल्ट इंटरफ़ेस का आईपी पता प्राप्त करने का एक बेहतर तरीका होगा, जो कि सही समय पर सही होना चाहिए।
टीसीपी जैसे कनेक्शन-उन्मुख प्रोटोकॉल द्वारा सर्वर से कनेक्ट करने के लिए उपयोग किए जाने वाले वास्तविक आईपी पते को भी बेहतर तरीके से प्राप्त करने का एक तरीका होगा। मैं वास्तव में है कि पता प्राप्त कर सकते हैं, लेकिन नहीं कनेक्शन खोलने के प्रयास के बिना:
def get_address_to_connect_to(server_addr):
non_open_port = 50000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((server_addr, non_open_port))
except socket.error:
pass
else:
s.close() # just in case
return s.getsockname()[0]
यह जब तक कुछ TCP समयबाह्य मामले कि सर्वर तक नहीं पहुंचा जा या बीच में एक बुराई फ़ायरवॉल ICMP ब्लॉक कर रहा है पूरी हो गई है को अवरुद्ध कर देगा पैकेट। क्या उस जानकारी को पाने का कोई बेहतर तरीका है?
आह, मीठा सहानुभूति! 'SOCK_DGRAM' के साथ, यह निकट-सही होगा! लेकिन मेरे मामले में 's.getsockname()' रिटर्न '('0.0.0.0', 51770)'। मैंने 's = socket.socket (socket.AF_INET, सॉकेट.SOCK_DGRAM) की कोशिश की है; s.sendto (b'hello ', (' 1.2.3.4 ', 50000)); s.getsockname() [0] '। यदि आप अपना कोड अपने उत्तर में जोड़ते हैं तो यह बहुत अच्छा होगा! – Feuermurmel
मेरे संपादन को उत्तर में देखें। – DNS
यह पूरी तरह से काम करता है; यह [डिस्कार्ड प्रोटोकॉल] का भी उपयोग करता है (http://en.wikipedia.org/wiki/Discard_Protocol) मुझे नहीं पता था! मैंने 'डेल एस' को 'साथ' कथन के साथ बदल दिया। – Feuermurmel