elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Convertir IntPtr que apunta a sockaddr en sockaddr
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Convertir IntPtr que apunta a sockaddr en sockaddr  (Leído 916 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Convertir IntPtr que apunta a sockaddr en sockaddr
« en: 18 Mayo 2015, 18:30 pm »

Hola a todos no encuentro la manera de traducir este código en C++ a C#:

Código
  1. /* Print all the available information on the given interface */
  2. void ifprint(pcap_if_t *d)
  3. {
  4.  pcap_addr_t *a;
  5.  char ip6str[128];
  6.  
  7.  /* Name */
  8.  printf("%s\n",d->name);
  9.  
  10.  /* Description */
  11.  if (d->description)
  12.    printf("\tDescription: %s\n",d->description);
  13.  
  14.  /* Loopback Address*/
  15.  printf("\tLoopback: %s\n",(d->flags & PCAP_IF_LOOPBACK)?"yes":"no");
  16.  
  17.  /* IP addresses */
  18.  for(a=d->addresses;a;a=a->next) {
  19.    printf("\tAddress Family: #%d\n",a->addr->sa_family);
  20.  
  21.    switch(a->addr->sa_family)
  22.    {
  23.      case AF_INET:
  24.        printf("\tAddress Family Name: AF_INET\n");
  25.        if (a->addr)
  26.          printf("\tAddress: %s\n",iptos(((struct sockaddr_in *)a->addr)->sin_addr.s_addr));
  27.        if (a->netmask)
  28.          printf("\tNetmask: %s\n",iptos(((struct sockaddr_in *)a->netmask)->sin_addr.s_addr));
  29.        if (a->broadaddr)
  30.          printf("\tBroadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
  31.        if (a->dstaddr)
  32.          printf("\tDestination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
  33.        break;
  34.  
  35.      case AF_INET6:
  36.        printf("\tAddress Family Name: AF_INET6\n");
  37.        if (a->addr)
  38.          printf("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
  39.       break;
  40.  
  41.      default:
  42.        printf("\tAddress Family Name: Unknown\n");
  43.        break;
  44.    }
  45.  }
  46.  printf("\n");
  47. }

Lo que he conseguido traducir a C#:

Código
  1. public void GetDeviceInf(pcap_if dev)
  2.        {
  3.            String inf="";
  4.            pcap_addr addresses;
  5.            IntPtr ip6str;//char ip6str[128];
  6.            sockaddr addr;
  7.  
  8.            inf += "Nombre de la interfaz: " + dev.name + Environment.NewLine;
  9.  
  10.            if (dev.description!=null)
  11.             inf += "Descripción de la interfaz: " + dev.description + Environment.NewLine;
  12.  
  13.            //inf += "Loopback: " + dev.flags + PCAP_IF_LOOPBACK ",(d.flags & PCAP_IF_LOOPBACK)?"yes":"no");
  14.  
  15.            do
  16.            {
  17.                addresses=dev.addresses;
  18.                addr = (sockaddr)Marshal.PtrToStructure(addresses.addr, typeof(sockaddr));
  19.                inf += "ADDR.SA_DATA: " + addr.sa_data + Environment.NewLine;
  20.                inf += "Address Family:: " + addr.sa_family + Environment.NewLine;
  21.                Console.WriteLine(inf);
  22.                switch(addr.sa_family)
  23.                {
  24.                    //case AF_INET:
  25.                      //  Console.WriteLine("Address Family Name: AF_INET\n");
  26.                    /*//if (addresses)
  27.                        
  28.                         Console.WriteLine("Address: %s\n",iptos((addr.sin_addr.s_addr));
  29.                     if (addresses.netmask!=null)
  30.                         //Console.WriteLine("Netmask: %s\n",((struct sockaddr_in *)addresses.netmask).sin_addr.s_addr);
  31.                     if (addresses.broadaddr!=null)
  32.                         //Console.WriteLine("Broadcast Address: %s\n",iptos(((struct sockaddr_in *)a->broadaddr)->sin_addr.s_addr));
  33.                     if (addresses.dstaddr!=null)
  34.                         Console.WriteLine("Destination Address: %s\n",iptos(((struct sockaddr_in *)a->dstaddr)->sin_addr.s_addr));
  35.                     break;
  36.  
  37.                     case AF_INET6:
  38.                         Console.WriteLine("\tAddress Family Name: AF_INET6\n");
  39.                     if (a->addr)
  40.                         Console.WriteLine("\tAddress: %s\n", ip6tos(a->addr, ip6str, sizeof(ip6str)));
  41.                     break;
  42.  
  43.                     default:
  44.                     printf("\tAddress Family Name: Unknown\n");
  45.                     break;*/
  46.                }
  47.                Console.WriteLine(inf);
  48.                inf="";
  49.            }while(addresses.next!=IntPtr.Zero);
  50.        }

Addresses.addr es de tipo IntPtr y apunta a una estructura de tipo pcap_addr hasta ahí todo bien pues lo igualo sin problemas. Luego el puntero addresses.addr que es un puntero de tipo IntPtr que apunta a una estructura de tipo sockaddr trato de pasarlo a estrcutura con la siguiente linea de codigo:

Código
  1. addr = (sockaddr)Marshal.PtrToStructure(addresses.addr, typeof(sockaddr));

Y esto falla, ¿porque se produce este error?

Pues el objetivo final no es mas que sacar datos de la interfaz de red.

He leído esto y he buscado pero no consigo superarlo, ayuda y gracias de antemano.

Edito: me estoy mirando esto a ver si me lo saben resolver o al menos lo entiendo xD y funciona.

Saludos socios.


« Última modificación: 18 Mayo 2015, 18:36 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Bing se apunta al Día Mundial IPv6
Noticias
wolfbcn 5 1,569 Último mensaje 10 Febrero 2011, 09:42 am
por Servia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines