关于在数据链路层发送数据的问题?(附代码)

kitling 2005-01-17 11:59:37
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/in.h>
#include <linux/if_ether.h>

#include "c/include/getlocaladdress.h" //自己写的一个获取本地机mac和ip地址的程序

int main(int argc,char **argv)
{
int sock,i,number;
unsigned char frame[1024];
char temp[12];
long int n;
char c[32];
struct local_address_t la; //自己写的结构,用于取得mac和ip地址
struct sockaddr addr;

if( (sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL)))<0 )
{
perror("Socket");
exit(1);
}

if(getlocaladdress(sock,&la)==-1) //返回ip与mac
{
perror("getlocaladdress");
exit(1);
}

for(i=0;i<6;i++)
frame[i]=0xff;

for(i=0;i<6;i++)
{
frame[i+6]=(la.amacx[2*i] << 4) | la.amacx[2*i+1]; //la.amacx 存本地mac
}

frame[12]=0x08;
frame[13]=0x06;

frame[14]=0x00;
frame[15]=0x01;

frame[16]=0x08;
frame[17]=0x00;

frame[18]=0x06;
frame[19]=0x04;

frame[20]=0x00;
frame[21]=0x01;

for(i=0;i<6;i++)
frame[22+i]=frame[i+6];

frame[28]=la.aip >> 24 & 0x000000ff; //la.aip 是本地ip
frame[29]=la.aip >> 16 & 0x000000ff;
frame[30]=la.aip >> 8 & 0x000000ff;
frame[31]=la.aip & 0x000000ff;

for(i=32;i<38;i++)
frame[i]=0x00;

frame[38]=10;
frame[39]=22;
frame[40]=1;
frame[41]=172;

for(i=42;i<64;i++) //这里有一个问题!!!
frame[i]=0x20;

for(i=0;i<60;i++)
{
if(!(i%12)) printf("\t");
if(!(i%24)) printf("\n");

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

printf("[%s] ",la.aname);

memset(&addr,0,sizeof addr);
strcpy(addr.sa_data,"eth0");

i=sendto(sock,&frame,sizeof frame,0,&addr,sizeof addr);

printf("error:%d,%s\n",i,strerror(errno));

close(sock);
exit(0);
}


1. 执行上面的代码,sendto会出错,会出现" error : -1 , Invalid argument"的错误,如何改正才能在二层发送数据???

2. 为什么我截获的二层arp数据包,有时是60个字节(多见于计算机发出的),有时是64个字节(交换机发出的),为什么??? CRC要由用户来填写吗???


谢谢!
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
kitling 2005-01-18
  • 打赏
  • 举报
回复
没用,

我改为sendto(sock,frame,60,0,&addr,sizeof(struct sockaddr));

结果还是一样的。

哪位大侠能我一个发送二层数据包的原代码(能用的)。

谢谢!!!
wangjinhu 2005-01-17
  • 打赏
  • 举报
回复
sizeof frame,0,&addr,sizeof addr?
参数
不对
kitling 2005-01-17
  • 打赏
  • 举报
回复
是我抄错了。但是改为

sendto(sock,frame,sizeof frame,0,&addr,sizeof addr);

也不成!

还是同样的错误提示!!!
walterzh 2005-01-17
  • 打赏
  • 举报
回复
sendto(sock,frame,sizeof frame,0,&addr,sizeof addr);
frame不用&的吧

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧