Russian Qt Forum
Май 15, 2024, 05:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблемы переноса кода Linux->Windows  (Прочитано 7236 раз)
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;
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Март 16, 2010, 13:52 »

Ну так замените на классы из QtNetwork Qt4 . Или я не понял?  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Serewka
Гость
« Ответ #2 : Март 16, 2010, 13:54 »

Ну было бы просто замечательно!
Наводку дайте на классы. Я новичок!
Заранее спасибо!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Март 16, 2010, 14:17 »

Наводку дайте на классы. Я новичок!

Network Programming
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Serewka
Гость
« Ответ #4 : Март 18, 2010, 18:10 »

res_init
res_search
dn_expand


какие аналоги данных Linux ф-ий используются в Windows?

Записан
niXman
Гость
« Ответ #5 : Март 18, 2010, 18:23 »

этот код был написан без расчета переноса на другую, отличную от *nix ОС.
так что стОит подумать о написании системнозависимого кода с нуля.
Записан
Serewka
Гость
« Ответ #6 : Март 31, 2010, 18:29 »

Как в QtNetwork определить адрес шлюза связанного с сетевым интерфейсом?
Записан
ieroglif
Гость
« Ответ #7 : Март 31, 2010, 18:54 »

rftm (простите за мой французский =) )
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 19.