diff --git a/Ping.cpp b/Ping.cpp index 07f2850..9053dfa 100644 --- a/Ping.cpp +++ b/Ping.cpp @@ -136,12 +136,12 @@ static err_t ping_send(int s, ip4_addr_t *addr, int size) { to.sin_len = sizeof(to); to.sin_family = AF_INET; - inet_addr_from_ipaddr(&to.sin_addr, addr); + inet_addr_from_ip4addr(&to.sin_addr, addr); if ((err = sendto(s, iecho, ping_size, 0, (struct sockaddr*)&to, sizeof(to)))) { transmitted++; } - free(iecho) + free(iecho); return (err ? ERR_OK : ERR_VAL); } @@ -169,7 +169,7 @@ static void ping_recv(int s) { /// Get from IP address ip4_addr_t fromaddr; - inet_addr_to_ipaddr(&fromaddr, &from.sin_addr); + inet_addr_to_ip4addr(&fromaddr, &from.sin_addr); strcpy(ipa, inet_ntoa(fromaddr)); @@ -230,28 +230,58 @@ static void stop_action(int i) { stopped = 1; } -+/ +*/ /* * Operation functions * */ -void ping(const char *name, int count, int interval, int size, int timeout) { + +bool ping(const char *name, int count, int interval, int size, int timeout) { + return ping(name, count, interval, size, timeout, NULL); +} + +bool ping(const char *name, int count, int interval, int size, int timeout, struct ping_result *result) { + struct addrinfo hints, *target; + int err; // Resolve name - hostent * target = gethostbyname(name); - IPAddress adr = *target->h_addr_list[0]; - if (target->h_length == 0) { + log_i("PING %s\r\n", name); + + memset(&hints, 0, sizeof(hints)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_family = AF_INET; + if ((err = getaddrinfo(name, NULL, &hints, &target)) != 0) { + log_d("getaddrinfo error %d\r\n", err); + log_i("Cannot resolve %s: Unknown host\r\n", name); // TODO: error not found target????? - return; + if (result != NULL) { + result->transmitted = 0; + result->received = 0; + result->loss_rate = 0; + result->min_time = 0; + result->mean_time = 0; + result->max_time = 0; + result->var_time = 0; + } + return false; } - ping_start(adr, count, interval, size, timeout); + IPAddress adr = IPAddress(((struct sockaddr_in *)(target->ai_addr))->sin_addr.s_addr); + freeaddrinfo(target); + return ping_start(adr, count, interval, size, timeout, result); } bool ping_start(struct ping_option *ping_o) { - + return ping_start(ping_o->ip,ping_o->count,0,0,0); } + bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int timeout=0) { + + return ping_start(adr, count=0, interval=0, size=0, timeout=0, NULL); + +} + +bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int timeout=0, struct ping_result *result=NULL) { // driver_error_t *error; struct sockaddr_in address; ip4_addr_t ping_target; @@ -280,8 +310,8 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time } - address.sin_addr.s_addr = adr; - ping_target.addr = address.sin_addr.s_addr; + address.sin_addr.s_addr = adr; + ping_target.addr = address.sin_addr.s_addr; // Setup socket struct timeval tout; @@ -330,6 +360,16 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time ((((float)transmitted - (float)received) / (float)transmitted) * 100.0) ); + if (result != NULL) { + result->transmitted = transmitted; + result->received = received; + result->loss_rate = ((((float)transmitted - (float)received) / (float)transmitted) * 100.0); + result->min_time = min_time; + result->mean_time = mean_time; + result->max_time = max_time; + result->var_time = var_time; + } + if (received) { ping_resp pingresp; log_i("round-trip min/avg/max/stddev = %.3f/%.3f/%.3f/%.3f ms\r\n", min_time, mean_time, max_time, sqrt(var_time / received)); @@ -338,6 +378,7 @@ bool ping_start(IPAddress adr, int count=0, int interval=0, int size=0, int time pingresp.total_bytes = 1; pingresp.total_time = mean_time; pingresp.ping_err = 0; + return true; // ping_o->sent_function(ping_o, (uint8*)&pingresp); } diff --git a/PingTest/PingTest.ino b/PingTest/PingTest.ino index 482c938..5e1d664 100644 --- a/PingTest/PingTest.ino +++ b/PingTest/PingTest.ino @@ -13,6 +13,8 @@ const char ssid[] = "TP-LINK_C20B"; // your network SSID (name) const char password[] = "paolo-48"; // your network password +const char *host = "www.google.com"; // ping target hostname + void setup() { Serial.begin(115200); @@ -51,12 +53,67 @@ void loop() { ia[i++] =val ; } IPAddress adr = IPAddress(ia[0], ia[1], ia[2], ia[3]); - Serial.printf("Ping : %d . %d . %d . %d ->", ia[0], ia[1], ia[2], ia[3]); - if (ping_start(adr, 4, 0, 0, 5)) + Serial.printf("Ping : %d . %d . %d . %d -> ", ia[0], ia[1], ia[2], ia[3]); + struct ping_result result; + if (ping_start(adr, 4, 0, 0, 5, &result)) { + Serial.println("OK"); + Serial.println("--- statistics ---"); + Serial.print(result.transmitted); + Serial.print(" packets transmitted, "); + Serial.print(result.received); + Serial.print(" packets received, "); + Serial.print(result.loss_rate, 2); + Serial.println("% packet loss"); + Serial.print("round-trip min/avg/max/stddev = "); + Serial.print(result.min_time, 3); + Serial.print("/"); + Serial.print(result.mean_time, 3); + Serial.print("/"); + Serial.print(result.max_time, 3); + Serial.print("/"); + Serial.print(result.var_time / result.received, 3); + Serial.println(" ms"); + } else { + Serial.println("FAILED"); + Serial.println("--- statistics ---"); + Serial.print(result.transmitted); + Serial.print(" packets transmitted, "); + Serial.print(result.received); + Serial.print(" packets received, "); + Serial.print(result.loss_rate, 2); + Serial.println("% packet loss"); + } + + Serial.printf("Ping : %s -> ", host); + if (ping(host, 4, 0, 0, 5, &result)) { Serial.println("OK"); - else + Serial.println("--- statistics ---"); + Serial.print(result.transmitted); + Serial.print(" packets transmitted, "); + Serial.print(result.received); + Serial.print(" packets received, "); + Serial.print(result.loss_rate, 2); + Serial.println("% packet loss"); + Serial.print("round-trip min/avg/max/stddev = "); + Serial.print(result.min_time, 3); + Serial.print("/"); + Serial.print(result.mean_time, 3); + Serial.print("/"); + Serial.print(result.max_time, 3); + Serial.print("/"); + Serial.print(result.var_time / result.received, 3); + Serial.println(" ms"); + } else { Serial.println("FAILED"); - delay(10000); + Serial.println("--- statistics ---"); + Serial.print(result.transmitted); + Serial.print(" packets transmitted, "); + Serial.print(result.received); + Serial.print(" packets received, "); + Serial.print(result.loss_rate, 2); + Serial.println("% packet loss"); + } + delay(5000); } int readnu(char s) { @@ -71,4 +128,4 @@ int readnu(char s) { } Serial.println(digit); return digit; -} \ No newline at end of file +} diff --git a/ping.h b/ping.h index fca77b2..29bfbd6 100644 --- a/ping.h +++ b/ping.h @@ -26,8 +26,20 @@ struct ping_resp { int8_t ping_err; }; +struct ping_result { + uint32_t transmitted = 0; + uint32_t received = 0; + float loss_rate = 0; + float min_time = 0; + float max_time = 0; + float mean_time = 0; + float last_mean_time = 0; + float var_time = 0; +}; + bool ping_start(struct ping_option *ping_opt); -void ping(const char *name, int count, int interval, int size, int timeout); +bool ping(const char *name, int count, int interval, int size, int timeout); +bool ping(const char *name, int count, int interval, int size, int timeout, struct ping_result *result); bool ping_start(IPAddress adr, int count, int interval, int size, int timeout); - -#endif \ No newline at end of file +bool ping_start(IPAddress adr, int count, int interval, int size, int timeout, struct ping_result *result); +#endif