2010-04-26 16 views
23

मैं अनुरोध के लिए बंदरगाह पर सुनने के लिए टीसीपी क्लाइंट का उपयोग कर रहा हूं। जब क्लाइंट से अनुरोध आते हैं तो मैं क्लाइंट आईपी को अनुरोध करने के बारे में जानना चाहता हूं।मैं टीसीपी क्लाइंट का उपयोग कर क्लाइंट आईपी पता कैसे प्राप्त करूं?

मैं कोशिश की है:

Console.WriteLine(tcpClient.Client.RemoteEndPoint.ToString()); 
Console.WriteLine(tcpClient.Client.LocalEndPoint.ToString()); 
var networkStream = tcpClient.GetStream(); 
var pi = networkStream.GetType().GetProperty("Socket", BindingFlags.NonPublic | BindingFlags.Instance); 
var socketIp = ((Socket)pi.GetValue(networkStream, null)).RemoteEndPoint.ToString(); 
Console.WriteLine(socketIp); 

इन पतों उत्पादन 10.x.x.x पतों जो निजी पते दिए गए हैं और स्पष्ट रूप से मेरे नेटवर्क अनुरोध कर बंद ग्राहकों के पते नहीं हैं सब के सब। अनुरोध करने वाले ग्राहकों के सार्वजनिक आईपी प्राप्त करने के लिए मैं क्या कर सकता हूं?

संपादित करें: हम टीसीपी अग्रेषण के साथ एक अमेज़ॅन ईसी 2 लोड बैलेंसर का उपयोग कर रहे हैं। क्या इस सेट में सही क्लाइंट आईपी प्राप्त करने का कोई तरीका है?

((IPEndPoint)tcpClient.Client.RemoteEndPoint).Address.ToString() 

ग्राहक एक आंतरिक नेटवर्क के माध्यम से आप कनेक्ट कर रहा है, तो मुझे यकीन है कि तुम वापस ग्राहक के लिए प्राप्त करने के लिए है कि जानकारी की जरूरत नहीं होगी कनेक्शन के बाद से अपने सार्वजनिक आईपी प्राप्त कर सकते हैं नहीं कर रहा हूँ:

+0

आप कैसे सुनिश्चित कर सकते हैं कि पते आपके नेटवर्क से ग्राहकों के "स्पष्ट" नहीं हैं। क्या आप कम से कम अपने ग्राहकों के आईपी रेंज को जानते हैं? क्या वे आपके आंतरिक नेटवर्क में रहते हैं, क्या वे सार्वजनिक इंटरनेट में रहते हैं? –

+4

क्योंकि वे सभी 10 शुरू होते हैं। - यह एक निजी आईपी रेंज इंगित करता है जो सार्वजनिक आईपी पता नहीं है। http://en.wikipedia.org/wiki/Private_network – brendan

उत्तर

8

ऐसा लगता है कि आपका सर्वर NAT का उपयोग कर लोड बैलेंसर या राउटर के पीछे है। इस मामले में, आईपी पैकेट में मूल ग्राहक का पता नहीं होगा, लेकिन एनएटी राउटर का पता होगा। केवल एनएटी राउटर प्रेषक के पते (आईपी स्तर पर) जानता है।

जो भी उच्च स्तरीय प्रोटोकॉल आप टीसीपी के शीर्ष पर उपयोग कर रहे हैं उसके आधार पर, आप उस से क्लाइंट पहचान प्राप्त करने में सक्षम हो सकते हैं, हालांकि उच्च स्तर पर ऐसी जानकारी को धोखा देना बहुत आसान है, अगर यह चिंता हो सकती है।

यदि आपको केवल शोध उद्देश्यों के लिए इस डेटा की आवश्यकता है, तो आपका एनएटी डिवाइस लॉग रख सकता है।

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

+0

हम टीसीपी अग्रेषण के साथ एक अमेज़ॅन ईसी 2 लोड बैलेंसर का उपयोग कर रहे हैं - मुझे कोई अनुरोध है कि मैं इसे अनुरोध क्लाइंट आईपी देने के लिए कैसे प्राप्त कर सकता हूं? – brendan

+0

आपको उस पर अमेज़ॅन के संपर्क में रहना होगा। यह एक अतिरिक्त शुल्क के लिए एक एड-ऑन पैकेज हो सकता है। –

68

इस काम करता है ।

+0

मेरे लिए काम किया, धन्यवाद! – DrNachtschatten

-6
AdresseIP = DirectCast(SocketClient.Client.RemoteEndPoint, IPEndPoint).Address.ToString 
+3

क्या यह @ केल्सी उत्तर जैसा नहीं है, बस 'vb' में? –

+1

आपको अपने उत्तर में एक स्पष्टीकरण जोड़ना चाहिए। यदि आप केवल कोड प्रदान करते हैं (विशेष रूप से अधिक जटिल उत्तरों के लिए), लोगों को यह नहीं पता कि इसका उपयोग कैसे किया जाए। – starbeamrainbowlabs

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