जैसा कि पहले उल्लेख शामिल करना, ऐसा करने का सही बात struct ifreq
का उपयोग इंटरफ़ेस नाम निर्दिष्ट करने के लिए है। मेरा कोड नमूना यहाँ है।
#define SERVERPORT 5555
...
struct ifreq ifr;
/* Create the socket */
sd = socket(AF_INET, SOCK_STREAM, 0);
if (sd < 0)
{
printf("Error in socket() creation - %s", strerror(errno));
}
/* Bind to eth1 interface only - this is a private VLAN */
memset(&ifr, 0, sizeof(ifr));
snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "eth1");
if ((rc = setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, (void *)&ifr, sizeof(ifr))) < 0)
{
perror("Server-setsockopt() error for SO_BINDTODEVICE");
printf("%s\n", strerror(errno));
close(sd);
exit(-1);
}
/* bind to an address */
memset(&serveraddr, 0x00, sizeof(struct sockaddr_in));
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons(SERVERPORT);
serveraddr.sin_addr.s_addr = inet_addr("9.1.2.3");
int rc = bind(sd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
मैं भी है कि जोड़ने के लिए एक सुरक्षा के नजरिए से, जबकि यह एक अंतरफलक के लिए सॉकेट बाध्य करने के लिए अच्छा है चाहते हैं, यह भावना सुनने के आईपी पते के रूप में INADDR_ANY
उपयोग करने के लिए नहीं है। ऐसा करने से पोर्ट सभी नेटवर्क इंटरफेस पर नेटस्टैट में खुल जाएगा।
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 0.0.0.0:5555 0.0.0.0:* LISTEN 0 210898 26996/myserver
इसके बजाय, मैंने इंटरफ़ेस (एक निजी वीएलएएन) का उपयोग करने के लिए विशिष्ट आईपी पता निर्दिष्ट किया है। इसने नेटस्टैट आउटपुट को भी ठीक किया:
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 9.1.2.3:5555 0.0.0.0:* LISTEN 0 210898 26996/myserver
आप ऐसा क्यों करना चाहते हैं? आपका प्रोग्राम पोर्टेबिलिटी खो देगा जबतक कि आप सुनिश्चित न हों कि आपकी मशीनों में पूर्वनिर्धारित नामों वाले इंटरफेस होंगे। –
यह एम्बेडेड डिवाइस के लिए है, पोर्टेबिलिटी की आवश्यकता नहीं है। मेरे पास 6 ईथरनेट पोर्ट हैं और मुझे विशिष्ट इंटरफ़ेस – Dima