मेरे पास क्लाइंट से आने वाली सॉकेट वाला सर्वर है। मुझे दूरस्थ क्लाइंट का आईपी पता प्राप्त करने की आवश्यकता है। in_addr
के लिए Google खोज करने का प्रयास किया लेकिन यह थोड़ा परेशानी है। कोई सुझाव?आने वाले सॉकेट कनेक्शन का स्रोत पता प्राप्त करना
उत्तर
आपको getpeername
फ़ंक्शन की आवश्यकता है। नेटवर्किंग के लिए महान बीज की मार्गदर्शिका में page about it है। यहाँ वहाँ से एक कोड नमूना है:
// assume s is a connected socket
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1। हालांकि हमें इसके लिए कोई स्मृति मुक्त नहीं करना है? – iammilind
मुझे लगता है कि 'संरचना sockaddr_in * s' बाहरी दायरे में सॉकेट 's' छाया करता है। एक छायादार चर होने के आदर्श नहीं है। –
'स्वीकार() 'का उपयोग कर सीधे – Bionix1441
जब से तुम कहना है कि यह एक ग्राहक से एक इनकमिंग कनेक्शन, तुम बस पता है कि accept()
कॉल द्वारा दिया गया था बचा सकता है getpeername
के लिए एक विकल्प के रूप में, दूसरे और तीसरे में है मापदंडों।
मान लें कि आप आने वाले सॉकेट कनेक्शन स्वीकार करने के लिए accept()
का उपयोग कर रहे हैं, getpeername()
की आवश्यकता नहीं है। पता जानकारी accept()
कॉल के दूसरे और तीसरे पैरामीटर के माध्यम से उपलब्ध है।
यहाँ एली के जवाब getpeername()
बिना यह करने के लिए संशोधित किया गया है:
int client_socket_fd;
socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;
len = sizeof addr;
client_socket_fd = accept(server_socket_fd, (struct sockaddr*)&addr, &len);
// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
struct sockaddr_in *s = (struct sockaddr_in *)&addr;
port = ntohs(s->sin_port);
inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
port = ntohs(s->sin6_port);
inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}
printf("Peer IP address: %s\n", ipstr);
+1 से सॉकेट डिस्क्रिप्टर प्राप्त करने का कोई तरीका है। हालांकि हमें इसके लिए कोई स्मृति मुक्त नहीं करना है? – iammilind
@iammilind: मुझे नहीं लगता कि किसी भी स्मृति को मुक्त करने की जरूरत है-मैं कोई गतिशील आवंटन नहीं कर सकता। यह सब स्थिर आवंटित चर के साथ किया जाता है। –
- 1. आने वाले कनेक्शन को निर्धारित करने के लिए स्थानीय मशीन
- 2. रिमोट सॉकेट एंडपॉइंट का आईपी पता प्राप्त करना
- 3. जावा सॉकेटसेवर: कई आने वाले कनेक्शन कैसे संभालें?
- 4. आने वाले xmpp संदेश का टाइमस्टैम्प कैसे प्राप्त करें?
- 5. एक पाइथन सॉकेट पर डेटा प्राप्त करना
- 6. एकाधिक सॉकेट कनेक्शन
- 7. boost :: asio: आने वाले कनेक्शन को स्वीकार करने के लिए मैं async_accept का उपयोग कैसे करूं?
- 8. सॉकेट कनेक्शन
- 9. कनेक्शन का पता लगाने() एक सॉकेट fsockopen द्वारा खोला
- 10. मौजूदा सॉकेट कनेक्शन
- 11. एसएमएस आने वाले और आउटगोइंग
- 12. स्कैपी पैकेट के आने वाले समय प्राप्त करें
- 13. सी # यूडीपी सॉकेट: रिसीवर पता प्राप्त करें
- 14. आउटगोइंग सॉकेट कनेक्शन का नकल कैसे करें?
- 15. पायथन सॉकेट कनेक्शन टाइमआउट
- 16. मैं सॉकेट से आईपी पता कैसे प्राप्त करूं विंडोज
- 17. Node.js टीसीपी सर्वर आने वाले बफर
- 18. नेटबीन के साथ आने वाले "appframework.jar" का स्रोत कहां डाउनलोड कर सकता हूं?
- 19. दूरस्थ डेस्कटॉप कनेक्शन का स्रोत खोजें
- 20. कई आने वाले पैकेट को संभालने का सबसे अच्छा तरीका
- 21. टीसीपी सॉकेट कोई कनेक्शन टाइमआउट
- 22. कस्टम डायरेक्टशो आरटीएसपी/आरटीपी स्रोत पुश फ़िल्टर लिखना - लाइव स्रोतों से आने वाले टाइमस्टैम्पिंग डेटा
- 23. एंड्रॉइड पर आने वाले एसएमएस का विश्लेषण कैसे करें?
- 24. पायथन: सबनेट-रूटर के लिए निर्धारित पैकेट प्राप्त करने के लिए आईपीवी 6 सॉकेट प्राप्त करना कोई भी पता पता
- 25. स्थानीय आईपी पता प्राप्त करना
- 26. .NET में धागे पर tcplistener आने वाले कनेक्शन कैसे प्रसारित करें?
- 27. मेरा आईपी पता प्राप्त करना
- 28. प्रति कनेक्शन बैंडविड्थ आंकड़े प्राप्त करना
- 29. सॉकेट सेट स्रोत पोर्ट नंबर
- 30. अनसुलझा सॉकेट पता
in_addr आईपीवी 4-विशिष्ट है, वैसे भी – bortzmeyer
man getpeername
–देख inet_ntoa (..) लिनक्स में समारोह .. 'आदमी inet_ntoa'। यह arpa/inet.h सहित मेरी राय और जरूरतों में inet_ntop से आसान है। यहां एक उदाहरण दिया गया है: http://www.binarytides.com/programming-udp-sockets-c-linux/ – mhk