非常有价值的参考资料:
http://blog.youkuaiyun.com/lianghe_work/article/details/45190379
http://www.cnblogs.com/hnrainll/archive/2011/09/21/2183940.html
接收IP包,封装成udp包,打上MAC帧头从网卡发出去的程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <libnet.h>
char * sock_ntop(const struct sockaddr* sa,socklen_t salen) {
char portstr[8];
static char str[128];
struct sockaddr_in *sin=(struct sockaddr_in*)sa;
if(inet_ntop(AF_INET,&sin->sin_addr,str,sizeof(str))==NULL) return NULL;
if(ntohs(sin->sin_port)!=0) {
snprintf(portstr,sizeof(portstr),":%d",ntohs(sin->sin_port));
strcat(str,portstr);
}
return str;
}
/*以太网头*/
struct sniff_ethernet
{
u_char ether_dhost[ETHER_ADDR_LEN];
u_char ether_shost[ETHER_ADDR_LEN];
u_short ether_type;
};
/*IP头*/
struct sniff_ip
{
u_char ip_vhl;
u_char ip_tos;
u_short ip_len;