关于在数据链路层发送数据的问题?(附代码)
#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要由用户来填写吗???
谢谢!