/** UDPSend */ int udpsend(int localport,char* dstip,int dstport,char* msg, int len) { struct sockaddr_in ina; int i; i=udpbyport(localport); if (i<0) i=udpcreate(localport); if (i>=0) { ina.sin_family = AF_INET; ina.sin_port = htons((unsigned short)dstport); ina.sin_addr.s_addr = inet_addr_bin(dstip); // hack pour dns. dans le bytecode de simu, on considère que // 192.168.1.1 est le dns. Si on essaie d'envoyer un paquet à // cette adresse, il faut translater vers le "vrai" dns. in_addr_t ip_192_168_1_1 = inet_addr("192.168.1.1"); if (!memcmp(&(ina.sin_addr),&ip_192_168_1_1, sizeof(ip_192_168_1_1))) { my_printf(LOG_SIMUNET, "Sockets : (hack) converting 192.168.1.1 to real dns ip\n"); res_init(); if (_res.nscount <= 0) { my_printf(LOG_SIMUNET, "Fatal error: no DNS available. Should abort\n"); return 0; }; ina.sin_addr = _res.nsaddr_list[0].sin_addr; } my_printf(LOG_SIMUNET, "Sockets : send %d bytes on chn %d\n",len,i); sendto(udp_sock[i],msg,len,0,(struct sockaddr *)&ina,sizeof(ina)); return 0; } return -1; }
//process PROCESS_THREAD(ntp_client_Process, ev, data) { static struct etimer ntp_timer; PROCESS_BEGIN(); //printf("ntp_client_Process begin\n"); process_start(&ntp_connectPprocess, NULL); ntp.client_sock = -1; ntp.exit_process = 0; ntp.retry_cnt = 0; ntp.client_sock = udpcreate(NTP_LOCAL_PORT, &ntp_connectPprocess); if(ntp.client_sock == -1) { printf("create udp socket fail"); ntp.exit_process = 1; } else { //printf("create socket:%d\n", ntp.client_sock); //us.pool.ntp.org(108.61.56.35) if( uiplib_ipaddrconv("108.61.56.35", &ntp.server_ip) == 0) { printf("erro ip format\n"); ntp.exit_process = 1; } } memset( &packet, 0, sizeof( ntp_packet ) ); *( ( char * ) &packet + 0 ) = 0x1b; // Represents 27 in base 10 or 00011011 in base 2. while(!ntp.exit_process) { if(ntp.retry_cnt > MAX_RETRYCNT) { printf("ntp client can not rece ntp server data, please check network\n"); break; } etimer_set(&ntp_timer, 1 * CLOCK_SECOND); PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER); if(udpsendto(ntp.client_sock, (char *)&packet, sizeof(packet), &ntp.server_ip, NTP_SERVER_PORT) == -1) { printf("udpsendto fail\n"); } ntp.retry_cnt++; } if(udpclose(ntp.client_sock) == -1) { printf("udpclose fail\n"); } process_post_synch(&ntp_connectPprocess, PROCESS_EVENT_EXIT, NULL); //printf("ntp_client_Process end\n"); PROCESS_END(); }