void do_net(void) { unsigned int len; if(!(EINT0PEND & (1 << 7))) goto end; if((len = eth_recv((void *)recv_buf)) > 14)//判断mac+ip/arp 一共14个字节 大于14表示有数据 eth_unpack();//板子解包 pc---->板子 板子解包 end: EINT0PEND = EINT0PEND; }
int main(int argc, char** argv) { struct sigaction siginthandler; siginthandler.sa_handler = sigcatcher; sigemptyset(&siginthandler.sa_mask); siginthandler.sa_flags = 0; sigaction(SIGINT, &siginthandler, NULL); sigaction(SIGHUP, &siginthandler, NULL); sigaction(SIGQUIT, &siginthandler, NULL); sigaction(SIGTERM, &siginthandler, NULL); sigaction(SIGKILL, &siginthandler, NULL); int socketfd = socket(AF_PACKET, SOCK_RAW, ntohs(0x0003)); if (socketfd < 0) { std::cout << "sockerror: " << strerror(errno) << std::endl; return -1; } int packbufsize = 1024*64; unsigned char packbuf[packbufsize]; struct sockaddr src_addr; socklen_t addrlen; memset(packbuf, 0, packbufsize); memset(&src_addr, 0, sizeof(sockaddr)); memset(&addrlen, 0, sizeof(addrlen)); int flags = 0; ssize_t packsize = 0; while (!sigcatch) { packsize = recvfrom(socketfd, packbuf, packbufsize, flags, &src_addr, &addrlen); if (packsize < 0) continue; eth_unpack(packbuf, packsize); } close(socketfd); return 0; }