El xs:
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <sys/socket.h>
#include <features.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/ip.h>
class MyClass {
int raw;
char * interfaz;
int proto;
int buffer;
public:
MyClass(char * i, int p, int b) {
interfaz = i;
proto = p;
buffer = b;
Makeraw();
BindRaw();
}
~MyClass() {}
void closesocket() {
close(raw);
}
void Makeraw()
{
if((raw = socket(PF_PACKET, SOCK_RAW, htons(proto)))== -1)
{
perror("Imposible crear socket: ");
}
}
int BindRaw()
{
struct sockaddr_ll esqueleto;
struct ifreq ifr;
bzero(&esqueleto, sizeof(esqueleto));
bzero(&ifr, sizeof(ifr));
strncpy((char *)ifr.ifr_name, interfaz, IFNAMSIZ);
if((ioctl(raw, SIOCGIFINDEX, &ifr)) == -1)
{
printf("No se encontro esta interfaz!\n");
return 0;
}
esqueleto.sll_family = AF_PACKET;
esqueleto.sll_ifindex = ifr.ifr_ifindex;
esqueleto.sll_protocol = htons(proto);
if((bind(raw, (struct sockaddr *)&esqueleto, sizeof(esqueleto)))== -1)
{
perror("Imposible poner a la escucha esta interfaz!\n");
return 0;
}
return 1;
}
char * ascii2hex(char * packet,int len)
{
if(!packet)
return 0;
char * buffer = new char[(2 * len)+2];
if(!buffer)
{
return 0;
}
for (int i = 0; i < len; i++)
{
sprintf(buffer + 2 * i, "%02x", packet[i]);
}
return buffer;
}
char *leer()
{
/* proto = ETH_P_ALL */
char packet_buffer[buffer];
int len;
struct sockaddr_ll packet_info;
int packet_info_size = sizeof(packet_info_size);
if((len = recvfrom(raw, packet_buffer, buffer, 0, (struct sockaddr*)&packet_info, (socklen_t*)&packet_info_size)) == -1)
{
perror("No se pudo leer (-1)!");
return 0;
}
else
{
return ascii2hex(packet_buffer,len);
}
return 0;
}
};
MODULE = Xianur0 PACKAGE = Xianur0
MyClass *
MyClass::new(char * i, int p, int b)
char*
MyClass::leer()
void
MyClass::closesocket()
void
MyClass::DESTROY()
Ejemplo del uso (perl):
use Xianur0;
require Exporter;
require DynaLoader;
@ISA = qw(Exporter DynaLoader);
@EXPORT = qw(rpcb_gettime getnetconfigent);
bootstrap Xianur0;
my $xia = new Xianur0("wlan0",3,2048);
my $contador = 10;
while(($contador--) != 0) {
print "Packet: ".$xia->leer()."\n";
}
$xia->closesocket();
$xia->DESTROY();
print "Terminamos!\n";
1 comentarios:
excelentee post xianur0
aunk no entendii muyy biien su funciiOn, tendree k ponermee a estuudiiarr un poco mas sobree esto,jajaja xDDDDD
saludOs weii.!
Publicar un comentario en la entrada