/** UDPCreate */ int udpcreate(int port) { int sockudp; struct sockaddr_in ina; int opt=1; int i; udpclose(port); i=udpgetfree(); if (i<0) return i; sockudp=socket(AF_INET,SOCK_DGRAM,0); if (sockudp==-1) return -1; ina.sin_family = AF_INET; ina.sin_port = htons((unsigned short)port); ina.sin_addr.s_addr = INADDR_ANY; if (bind(sockudp,(struct sockaddr*)&ina,sizeof(ina))!=0) { my_printf(LOG_SIMUNET, "Sockets : Udp port %d busy\n",port); close(sockudp); return -1; } setsockopt(sockudp, SOL_SOCKET, SO_REUSEADDR, (char*)&opt, sizeof (opt)); setsockopt(sockudp, SOL_SOCKET, SO_BROADCAST, (char*)&opt, sizeof (opt)); my_printf(LOG_SIMUNET, "Sockets : create Udp :%d (socket=%d)\n",port,sockudp); udp_port[i]=port; udp_sock[i]=sockudp; return i; }
//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(); }
int main() { udpsock s1 = udplisten(iplocal(NULL, 5555, 0)); udpsock s2 = udplisten(iplocal(NULL, 5556, 0)); ipaddr addr = ipremote("127.0.0.1", 5556, 0, -1); while(1) { udpsend(s1, addr, "ABC", 3); assert(errno == 0); char buf[3]; size_t sz = udprecv(s2, &addr, buf, sizeof(buf), now() + 100); if(errno == ETIMEDOUT) continue; assert(errno == 0); assert(sz == 3); break; } while(1) { udpsend(s2, addr, "DEF", 3); assert(errno == 0); char buf[3]; size_t sz = udprecv(s1, &addr, buf, sizeof(buf), now() + 100); if(errno == ETIMEDOUT) continue; assert(errno == 0); assert(sz == 3); break; } udpclose(s2); udpclose(s1); return 0; }