1,本例子使用一台PC,有两个网口,OS为CENTOS 6.8,然后使用两条网线分别都连接到同一个交换机上,当数据经过交换机时,交换机的数据灯会闪烁,否则就没有数据通过交换机。


2,开始测试,刚开始理所当然的想到的是TCP Server/TCP Client模式,建立socket

intserver_sockfd=socket(AF_INET,SOCK_STREAM,0);structsockaddr_inserver_sockaddr;server_sockaddr.sin_family=AF_INET;server_sockaddr.sin_port=htons(MYPORT);server_sockaddr.sin_addr.s_addr=inet_addr(IP_PORT_0);if(bind(server_sockfd,(structsockaddr*)&server_sockaddr,sizeof(server_sockaddr))==-1){perror("bind");exit(1);}if(listen(server_sockfd,QUEUE)==-1){perror("listen");exit(1);}charbuffer[BUFFER_SIZE];structsockaddr_inclient_addr;socklen_tlength=sizeof(client_addr);intconn=accept(server_sockfd,(structsockaddr*)&client_addr,&length);if(conn<0){perror("connect");exit(1);}while(1){memset(buffer,0,sizeof(buffer));intlen=recv(conn,buffer,sizeof(buffer),0);send(conn,buffer,len,0);}close(conn);close(server_sockfd);return0;}


TCP Client端同样写相应代码,编译通过,先后执行server/client程序,显示都有数据收发成功,但交换机的数据灯没有任何显示,于是明白了,系统默认直接从本地发送接收数据,并没有从网卡端口实际发送出去,因为TCP是基于IP协议之上,而IP协议是肯定走本地内部路由,因此使用TCP,UDP等IP之上的协议肯定不会成功。

intinit_sock(charindex[IFNAMSIZ]){intfd=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL));structsockaddr_llsll;structifreqifr;strncpy(ifr.ifr_name,index,IFNAMSIZ);ioctl(fd,SIOCGIFINDEX,&ifr);bzero(&sll,sizeof(sll));sll.sll_ifindex=ifr.ifr_ifindex;ioctl(fd,SIOCGIFHWADDR,&ifr);memcpy(sll.sll_addr,ifr.ifr_hwaddr.sa_data,6);sll.sll_family=AF_PACKET;sll.sll_protocol=htons(ETH_P_ALL);bind(fd,(structsockaddr*)&sll,sizeof(sll));returnfd;}


使用如上RAW Socket初始化后,再发送接收,一切OK!!!,能够接收到除了CRC之外的完整链路层帧,包括MAC地址,帧类型字段等,程序发送接收时,交换机的数据灯不停闪烁。