//制作模型初始配置文件 void ModelFormat(void) { FILE *fcfg; u16 i; memcpy(&Model,&ModelDef,sizeof(Model)); memcpy(&ModelBak,&ModelDef,sizeof(Model)); for(i=1;i<=MODCFG_NUM;i++) { char modelfile[13]; ModelBak.Name[5]=i/10+'0'; ModelBak.Name[6]=i%10+'0'; ModelBak.Name[7]=0; strcpy(modelfile,ModelFileName); modelfile[6]=i/10+'0'; modelfile[7]=i%10+'0'; PageAlertModel(ModelBak.Name,50); fcfg=fopen(modelfile,"wb"); if(fcfg) { fputbuf(&ModelBak,sizeof(ModelBak),fcfg); fclose(fcfg); } } Model.Name[5]=TxSys.ModelNo/10+'0'; Model.Name[6]=TxSys.ModelNo%10+'0'; Model.Name[7]=0; memcpy(&ModelBak,&Model,sizeof(Model)); }
void ModelSave(u16 id) { FILE *fcfg; u8 saveok=0; if(!memcmp(&ModelBak,&Model,sizeof(Model))) return; PageAlertModel("保存模型参数...",300); ModelFileName[6]=id/10+'0'; ModelFileName[7]=id%10+'0'; fcfg=fopen(ModelFileName,"wb"); if(fcfg) { if(fputbuf(&Model,sizeof(Model),fcfg)==sizeof(Model)) { saveok=1; } fclose(fcfg); } if(!saveok) { PageAlertModel("模型配置保存失败!",1000); } //备份供比较 memcpy(&ModelBak,&Model,sizeof(Model)); }
int main(int argc, const char * argv[]) { #ifdef ICMP // get the ping socket int ping = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP); { // Drop privelege immediately errno_t ping_errno = errno; setuid(getuid()); if (0 > ping) { errno = ping_errno; DIE(EX_OSERR, "open ping socket"); } LOG(2, "ping socket: %d", ping); } #endif // ICMP #ifdef DNS // get the dns socket int dns = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); { if (0 > dns) { DIE(EX_OSERR, "open dns socket"); } LOG(2, "dns socket: %d", dns); } #endif // DNS struct pollfd fds[2] = { #ifdef ICMP { ping, POLLIN, 0 } #endif // ICMP #ifdef BOTH , #endif // BOTH #ifdef DNS { dns, POLLIN, 0 } #endif // DNS }; int fd_count = 0; #ifdef ICMP int ping_index = fd_count++; #endif // ICMP #ifdef DNS int dns_index = fd_count++; #endif // DNS // process arguments struct opts_t opts; get_opts(argc, argv, &opts); const struct addrinfo * addr = get_one_host(opts.target); #ifdef ICMP int sequence = -1; struct icmp icmp_template; construct_icmp_template(&icmp_template); #endif // ICMP #ifdef DNS void * dns_template; size_t template_size = construct_dns_template(&dns_template, opts.query); LOG(3, "template: "); if (verbose() >= 3) { fputbuf(stderr, dns_template, template_size);fputc('\n', stderr); } #endif // DNS // initialize the prng srandomdev(); int count = -1; while (1) { ++count; #ifdef ICMP struct icmp icmp_message; size_t icmp_message_size; icmp_message_size = construct_icmp(&icmp_template, &icmp_message, ++sequence); ssize_t icmp_sent = sendto(ping, (const void *)&icmp_message, icmp_message_size, 0, addr->ai_addr, addr->ai_addrlen); if (0 > icmp_sent) DIE(EX_OSERR, "sendto ping"); LOG(1, "ping sent %d bytes", icmp_sent); long icmp_send_time = now_us(); long icmp_recv_time = -1; #endif // ICMP #ifdef DNS void * dns_message; size_t dns_message_size; short dns_id = (short)random(); dns_message_size = construct_dns(dns_template, template_size, &dns_message, dns_id); ssize_t dns_sent = sendto(dns, (const void *)dns_message, dns_message_size, 0, addr->ai_addr, addr->ai_addrlen); LOG(1, "dns sent %d bytes", dns_sent); if (verbose() >= 3) { fputbuf(stderr, dns_message, dns_message_size);fputc('\n', stderr); } if (0 > dns_sent) DIE(EX_OSERR, "sendto dns"); long dns_send_time = now_us(); long dns_recv_time = -1; #endif // DNS long ttd_ms = now_ms() + opts.period_ms; int poll_time = (int)opts.period_ms; int ret; while ((ret = poll(fds, fd_count, poll_time))) { if (0 > ret) DIE(EX_OSERR, "poll"); #ifdef ICMP if (fds[ping_index].revents & POLLERR) { int error = 0; socklen_t errlen = sizeof(error); if (0 < getsockopt(fds[0].fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen)) DIE(EX_OSERR, "getsockopt on ping while handling POLLERR"); errno = error; DIE(EX_OSERR, "POLLERR on ping"); } if (fds[ping_index].revents & POLLIN) { icmp_recv_time = process_ping(fds[ping_index].fd, sequence); } #endif // ICMP #ifdef DNS if (fds[dns_index].revents & POLLERR) { int error = 0; socklen_t errlen = sizeof(error); if (0 < getsockopt(fds[1].fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen)) DIE(EX_OSERR, "getsockopt on dns while handling POLLERR"); errno = error; DIE(EX_OSERR, "POLLERR on dns"); } if (fds[dns_index].revents & POLLIN) { dns_recv_time = process_dns(fds[dns_index].fd, dns_id); } #endif // DNS poll_time = (int)(ttd_ms - now_ms()); if (poll_time < 0) break; } LOG(1, "poll period %d ended", count); #ifdef ICMP REPORT("icmp", icmp_send_time, icmp_recv_time, sequence); #endif // ICMP #ifdef DNS REPORT("dns", dns_send_time, dns_recv_time, dns_id); #endif // DNS } return 0; }