From 9ee9959b3a29377911fc7b7cdd6463bc4972c524 Mon Sep 17 00:00:00 2001 From: isoppa Date: Wed, 17 Apr 2019 09:55:36 +0900 Subject: [PATCH 1/3] Fix some compile errors. --- Ping.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Ping.cpp b/Ping.cpp index 07f2850..a61e901 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,7 +230,7 @@ static void stop_action(int i) { stopped = 1; } -+/ +*/ /* * Operation functions * @@ -280,8 +280,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; From 58f00585c33ddd592c7434a030e1d009c1ee0745 Mon Sep 17 00:00:00 2001 From: isoppa Date: Wed, 17 Apr 2019 09:56:37 +0900 Subject: [PATCH 2/3] Add statistics output function. --- Ping.cpp | 20 +++++++++++++++++++- PingTest/PingTest.ino | 35 ++++++++++++++++++++++++++++++----- ping.h | 14 +++++++++++++- 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/Ping.cpp b/Ping.cpp index a61e901..26ee652 100644 --- a/Ping.cpp +++ b/Ping.cpp @@ -246,12 +246,19 @@ void ping(const char *name, int count, int interval, int size, int timeout) { ping_start(adr, count, interval, size, timeout); } 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; @@ -330,6 +337,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 +355,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..8ba3fe4 100644 --- a/PingTest/PingTest.ino +++ b/PingTest/PingTest.ino @@ -51,12 +51,37 @@ 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"); - 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 +96,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..d3d5c98 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_start(IPAddress adr, int count, int interval, int size, int timeout); +bool ping_start(IPAddress adr, int count, int interval, int size, int timeout, struct ping_result *result); -#endif \ No newline at end of file +#endif From 15c1cd339a61c113b5772decf1aaf94f3981456c Mon Sep 17 00:00:00 2001 From: isoppa Date: Thu, 18 Apr 2019 13:50:09 +0900 Subject: [PATCH 3/3] Fix failed to resolve hostname to ip address. --- Ping.cpp | 35 +++++++++++++++++++++++++++++------ PingTest/PingTest.ino | 32 ++++++++++++++++++++++++++++++++ ping.h | 4 ++-- 3 files changed, 63 insertions(+), 8 deletions(-) diff --git a/Ping.cpp b/Ping.cpp index 26ee652..9053dfa 100644 --- a/Ping.cpp +++ b/Ping.cpp @@ -235,15 +235,38 @@ static void stop_action(int i) { * 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) { diff --git a/PingTest/PingTest.ino b/PingTest/PingTest.ino index 8ba3fe4..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); @@ -81,6 +83,36 @@ void loop() { 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"); + 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"); + } delay(5000); } diff --git a/ping.h b/ping.h index d3d5c98..29bfbd6 100644 --- a/ping.h +++ b/ping.h @@ -38,8 +38,8 @@ struct ping_result { }; 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); bool ping_start(IPAddress adr, int count, int interval, int size, int timeout, struct ping_result *result); - #endif