c सबस सॉकेट्स-यह पता लगाने के लिए कि मुझे कौन सा बंदरगाह और पता सौंपा गया है




सबसे बड़ा बंदरगाह का नाम (2)

मुझे यह पता लगाने में परेशानी हो रही है - मैं इस गाइड का उपयोग कर सी में सॉकेट के साथ काम कर रहा हूं - http://binarii.com/files/papers/c_sockets.txt

मैं अपने आईपी और बंदरगाह का उपयोग कर स्वचालित रूप से प्राप्त करने की कोशिश कर रहा हूं:

server.sin_port = 0;              /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY;  /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

सफल बाध्य होने के बाद, मैं यह कैसे पता लगा सकता हूं कि वास्तव में मुझे कौन सी आईपी और पोर्ट असाइन किया गया है?


आपके कोड में टिप्पणी गलत है। INADDR_ANY सर्वर के आईपी को स्वचालित रूप से नहीं रखता है '। मार्क 4o के answer में बताए गए कारणों के लिए यह अनिवार्य रूप से 0.0.0.0 रखता है।


यदि यह एक सर्वर सॉकेट है, तो आपको अपनी सॉकेट पर listen() को कॉल करना चाहिए, और फिर पोर्ट नंबर को ढूंढने के लिए getsockname() को कॉल करना चाहिए जिस पर यह सुन रहा है:

struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
    perror("getsockname");
else
    printf("port number %d\n", ntohs(sin.sin_port));

आईपी ​​पते के लिए, यदि आप INADDR_ANY उपयोग करते हैं तो सर्वर सॉकेट किसी भी मशीन के आईपी पते से कनेक्शन स्वीकार कर सकता है और सर्वर सॉकेट में कोई विशिष्ट आईपी पता नहीं होता है। उदाहरण के लिए यदि आपकी मशीन में दो आईपी पते हैं तो आपको इस सर्वर सॉकेट पर दो आने वाले कनेक्शन मिल सकते हैं, प्रत्येक एक अलग स्थानीय आईपी पते के साथ। आप उस कनेक्शन पर कौन सा स्थानीय आईपी पता इस्तेमाल किया जा रहा है, यह जानने के लिए आप एक विशिष्ट कनेक्शन (जिसे आप accept() से सॉकेट पर getsockname() उपयोग कर सकते हैं।





tcp