⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testvnet4.c

📁 嵌入式系统的网络仿真
💻 C
字号:
//-------------------------------------------------------------------------//test get/set guestif macaddr,//test set iflag flag=IFF_UP|IFF_RUNNING;//test guestif<----->guestif communication//usage://testvnet4 s  server side, wait and read, should first//testvnet4 c  client side, write//-------------------------------------------------------------------------#include <net/if.h>#include <net/ethernet.h>#include <sys/ioctl.h>//#include <linux/if.h>#include "if_vnet.h"//from linux/sockios.h#define SIOCGIFADDR	0x8915		/* get PA address		*/#define SIOCSIFADDR	0x8916		/* set PA address		*/#define ETH_ALEN 6/*struct ethhdr {	unsigned char	h_dest[ETH_ALEN];		unsigned char	h_source[ETH_ALEN];	unsigned short	h_proto;};*/struct ethhdr packet1,packet2;int main(int argc, char **argv){int tapif_fd;unsigned flag;char buf[1024];unsigned char paddr[ETH_ALEN],paddr1[ETH_ALEN],paddr2[ETH_ALEN];fd_set frds;struct timeval tv;int ret;char myid;if (argc!=2) { printf("test guestif<---->guestif communication\n"); printf("server side:wait & read, client side:write\n"); printf("usage:testvnet4 c|s (client or server)\n"); exit(-1);}myid=argv[1][0];printf("test vnet ioctl\n");tapif_fd = open("/dev/net/vnet", 2);if(tapif_fd<0){ 	perror("open");exit(-1);};printf("open vnet ok!\n");  if (ioctl(tapif_fd, SIOCGIFADDR, (void *) paddr) < 0) {    printf("get mac addr error\n");    exit(-1);}printf("ioctl vnet get mac addr ok, addr is %x:%x:%x:%x:%x:%x \n", paddr[0],paddr[1],paddr[2],paddr[3],paddr[4],paddr[5]);	paddr1[0]=0;	paddr1[1]=1;	paddr1[2]=2;	paddr1[3]=3;	paddr1[4]=4;	paddr1[5]=5;	paddr2[0]=0;        paddr2[1]=2;        paddr2[2]=3;        paddr2[3]=4;        paddr2[4]=5;        paddr2[5]=6;if(myid=='c') 	memcpy(paddr,paddr1,ETH_ALEN);else	memcpy(paddr,paddr2,ETH_ALEN);if (ioctl(tapif_fd, SIOCSIFADDR, (void *) paddr) < 0) {    printf("set mac addr error\n");    exit(-1);}printf("ioctl vnet set mac addr ok\n");if (ioctl(tapif_fd, SIOCGIFADDR, (void *) paddr) < 0) {    printf("get mac addr error\n");    exit(-1);}printf("ioctl vnet get mac addr ok, addr is %x:%x:%x:%x:%x:%x \n", paddr[0],paddr[1],paddr[2],paddr[3],paddr[4],paddr[5]);flag=0;printf("ioctl vnet get ifflag\n");if (ioctl(tapif_fd, SIOCGIFFLAGS, (void *) &flag) < 0) {    printf("get mac addr error\n");    exit(-1);}printf("ioctl vnet get flag 0x%x\n",flag);flag=IFF_UP|IFF_RUNNING;printf("ioctl vnet set ifflag 0x %x\n",flag);if (ioctl(tapif_fd, SIOCSIFFLAGS, (void *) &flag) < 0) {    printf("get mac addr error\n");    exit(-1);}printf("ioctl vnet set ifflag ok.\n");//------------------------if(myid=='c'){//client side   printf("client test communication\n");   memcpy(&packet1.h_source,paddr1,ETH_ALEN);   memcpy(&packet1.h_dest,paddr2,ETH_ALEN);   packet1.h_proto=6;   printf("client write packet1 begin\n");    write(tapif_fd, &packet1, sizeof(packet1));   printf("client write packet1 end\n");    printf("client side end\n"); }else{// server side  printf("server test communication read\n");  memset(&packet2,0,sizeof(packet2));  memset(paddr1,0,sizeof(paddr1));  memset(paddr2,0,sizeof(paddr2));   FD_ZERO(&frds);  FD_SET(tapif_fd, &frds);  tv.tv_sec =0;  tv.tv_usec=0;  printf("server test select begin tapif_fd %d\n",tapif_fd);  ret=0;  if((ret=select(tapif_fd+1,&frds,NULL,NULL,NULL))>0) { //wait for ever if &tv=NULL   printf("server select ok! success ret %d\n",ret);   if(FD_ISSET(tapif_fd,&frds)){      printf("server test read\n");        read(tapif_fd, &packet2, sizeof(packet2));      memcpy(paddr1,&packet2.h_source,ETH_ALEN);      memcpy(paddr2,&packet2.h_dest,ETH_ALEN);        printf("server get packet src mac is %x:%x:%x:%x:%x:%x \n", paddr1[0],paddr1[1],paddr1[2],paddr1[3],paddr1[4],paddr1[5]);      printf("server get packet dest mac is %x:%x:%x:%x:%x:%x \n", paddr2[0],paddr2[1],paddr2[2],paddr2[3],paddr2[4],paddr2[5]);      printf("server side end\n");   }  }}	while(1){ sleep(30);};}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -