linux rawsocket java_linux Raw Socket 收发各种数据包

#include        // socket

#include       // socket

#include        // ioctl

#include           // ifreq

#include           // strcpy

#include            // printf

#include // sockaddr_ll

#define BOOL   unsigned char

#define U8     unsigned char

#define U16    unsigned short

#define TRUE   1

#define FALSE  0

static int fd;

static unsigned char if_mac[6];

static int if_index;

U8  gBuf[2000] = {0};

U8  gTxBuf[2000];

U16 gLen=0;

BOOL InitEtherNetIf(void)

{

struct ifreq req;

if ( (fd = socket(PF_PACKET, SOCK_RAW, htons( 0x0003 ) ) ) < 0 )

{

printf( "failed to create raw socket!\n" );

return FALSE;

}

strcpy( req.ifr_name, "eth1" );

if ( ioctl( fd, SIOCGIFFLAGS, &req ) < 0 )

{

printf( "failed to do ioctl!" );

return FALSE;

}

req.ifr_flags |= IFF_PROMISC;

if ( ioctl( fd, SIOCSIFFLAGS, &req ) < 0 )

{

printf( "failed to set eth0 into promisc mode!" );

return FALSE;

}

if ( ioctl( fd, SIOCGIFHWADDR, &req ) < 0 )

{

printf( "failed to get IF hw address!" );

return FALSE;

}

memcpy( if_mac, req.ifr_hwaddr.sa_data, sizeof(if_mac) );

if ( ioctl( fd, SIOCGIFINDEX, &req ) < 0 )

{

printf( "failed to get IF hw address!" );

return FALSE;

}

if_index = req.ifr_ifindex;

return TRUE;

}

BOOL GetPacket(U8 *buf, U16 *len)

{

int length = 0;

length = recvfrom( fd, buf, 2000, 0, NULL, NULL );

if ( length < 0 )

{

return 0;

}

else

{

*len = length;

return 1;

}

}

BOOL SendPacket(U8 *buf, U16 len)

{

struct sockaddr_ll link;

link.sll_ifindex = if_index;

memcpy( link.sll_addr, buf, link.sll_halen );

if ( sendto( fd, buf, len, 0, (struct sockaddr *)&link, sizeof(link) ) < 0 )

{

printf( "failed to send to RAW socket!\r\n" );

return 0;

}

return 1;

}

BOOL GetMacAddress(U8 *mac)

{

memcpy(mac, if_mac, sizeof(if_mac));

return TRUE;

}

void DispalyBuf(U8 *buf,U16 size)

{

int i;

for(i=0;i

{

if((0==i%16)&&(i>0)) printf("\n");

printf("%02x ",buf[i]);

}

printf("\n");

}

int main(void)

{

BOOL ret;

for(ret =0;ret<64;ret++) gTxBuf[ret]=ret;

if(InitEtherNetIf())

{

printf("send:\n");

DispalyBuf(gTxBuf,64);

SendPacket(gTxBuf,64);

while(1)

{

if(GetPacket(gBuf,&gLen))   DispalyBuf(gBuf,gLen);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值