Название: Проблемы переноса кода Linux->Windows
Отправлено: Serewka от Март 16, 2010, 13:01
Добрый день! При переносе кода из 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; }
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: kuzulis от Март 16, 2010, 13:52
Ну так замените на классы из QtNetwork Qt4 . Или я не понял? :)
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: Serewka от Март 16, 2010, 13:54
Ну было бы просто замечательно! Наводку дайте на классы. Я новичок! Заранее спасибо!
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: pastor от Март 16, 2010, 14:17
Наводку дайте на классы. Я новичок!
Network Programming (http://qt.nokia.com/doc/4.6/network-programming.html)
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: Serewka от Март 18, 2010, 18:10
res_init res_search dn_expand
какие аналоги данных Linux ф-ий используются в Windows?
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: niXman от Март 18, 2010, 18:23
этот код был написан без расчета переноса на другую, отличную от *nix ОС. так что стОит подумать о написании системнозависимого кода с нуля.
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: Serewka от Март 31, 2010, 18:29
Как в QtNetwork определить адрес шлюза связанного с сетевым интерфейсом?
Название: Re: Проблемы переноса кода Linux->Windows
Отправлено: ieroglif от Март 31, 2010, 18:54
rftm (простите за мой французский =) )
|