Добрый день!
При переносе кода из Linux в Windows возникли проблемы следующего характера.
Привожу определенные специфичные для Linux моменты. Далее полный код ф-ии.
Неопределенные структуры, ф-ии и SIOCGIFCONF, SIOCGIFFLAGS
Так же непонятно как быть с моментами из полного текста ф-ии типа: fd = fopen("/proc/net/if_inet6","r");
struct ifconf netconf;
...
struct ifreq *ifr;
...
err = ioctl( sock, SIOCGIFCONF, &netconf );
...
if (ioctl (sock, SIOCGIFFLAGS, ifr)) { perror ("ioctl:"); continue; }
Полный текст ф-ииiface_cfg * getIpAddressList( int af, int *count )
{
int sifr = sizeof(struct ifreq);
int sock, err, if_count;
struct ifconf netconf;
char buffer[sifr*MAX_IF];
iface_cfg *ret = NULL;
struct ifreq *ifr;
int i=0, j=0, k=0, n=0;
char *devclasses[]={ (char *) "wlan", (char *) "eth", (char *) "ppp", NULL };
char *devcl;
int devcli;
FILE *fd=NULL;
char ip6addr[33];
unsigned char dummy[100];
int ign; // flag
if (af == AF_INET)
{
// retrieve the IPv4 interfaces and addresses
netconf.ifc_len = sifr * MAX_IF;
netconf.ifc_buf = buffer;
sock = socket( PF_INET, SOCK_DGRAM, 0 );
err = ioctl( sock, SIOCGIFCONF, &netconf );
if ( err < 0 )
{
cout << "!!!!!Error in ioctl: " << errno << endl;
return NULL;
}
if_count = netconf.ifc_len / sifr;//32;
ret = ( iface_cfg * ) malloc( sizeof( iface_cfg ) * ( if_count + 1 ) );
if (!ret) return NULL;
for (devcli=0;;devcli++)
{
devcl=devclasses[devcli];
for (i=j=0; i<if_count; i++)
{
ifr = netconf.ifc_req + i;
if ( devcl && strncmp(devcl, ifr->ifr_name, strlen(devcl)) )
continue;
strncpy( ret[j].name, ifr->ifr_name, 20 );
if (!strcmp("lo",ret[j].name))
continue;
inet_ntop(AF_INET, &((struct sockaddr_in *)(&ifr->ifr_addr))->sin_addr, ret[j].addr, 20);
if (ioctl (sock, SIOCGIFFLAGS, ifr)) { perror ("ioctl:"); continue; }
if ( (ifr->ifr_flags & IFF_UP ) == 0 )
continue; // ignore down interface
ret[j].af = af;
j++;
}
if (!devcl) break;
}
close( sock );
ret[j].af=0;
*count=j;
return ret;
}
else if (af == AF_INET6)
{
*count=0;
fd = fopen("/proc/net/if_inet6","r");
if (!fd)
{
perror("fopen(\"/proc/net/if_inet6\",\"r\")");
return NULL;
}
j = k = 0;
while (1)
{
ret = ( iface_cfg * ) realloc( ret, sizeof( iface_cfg ) * ( k + 1 ) );
if (!ret) return NULL;
n = fscanf(fd,"%s %s %s %s %s %s",ip6addr,dummy,dummy,dummy,dummy,ret[k].name);
if (n!=6)
{
fclose(fd);
*count = k;
ret[k].af = 0;
return ret;
}
if (!strcmp("lo",ret[k].name))
continue;
for (i=0; i<32; i+=2)
{
dummy[i>>1]=(nybbleValue(ip6addr[i])<<4)+nybbleValue(ip6addr[i+1]);
}
// for sanity ignore link local and multicast addresses
ign=0;
if (dummy[0]==0xff) ign=1; // multicast
// else if ( dummy[0]==0xfe && (dummy[1]&0xc0)==0x80 ) ign=1; // link local
if (!ign)
{
inet_ntop(AF_INET6, dummy, ret[k].addr, 70);
ret[k].af=af;
k++;
}
}
}
return NULL;
}