From 11e77c719d692e84caddfd2643f3b3cf45798742 Mon Sep 17 00:00:00 2001 From: boarchuz Date: Sun, 27 Jan 2019 05:48:14 +1100 Subject: [PATCH 1/2] Add timeout to WiFiClient.connect() --- libraries/WiFi/src/WiFiClient.cpp | 27 +++++++++++++++++++++++---- libraries/WiFi/src/WiFiClient.h | 2 ++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiClient.cpp b/libraries/WiFi/src/WiFiClient.cpp index 8ea6c7afb65..974fe3c69e8 100644 --- a/libraries/WiFi/src/WiFiClient.cpp +++ b/libraries/WiFi/src/WiFiClient.cpp @@ -25,6 +25,7 @@ #define WIFI_CLIENT_MAX_WRITE_RETRY (10) #define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000) +#define WIFI_CLIENT_CONNECT_TIMEOUT_MS (60000) #define WIFI_CLIENT_FLUSH_BUFFER_SIZE (1024) #undef connect @@ -202,12 +203,17 @@ void WiFiClient::stop() } int WiFiClient::connect(IPAddress ip, uint16_t port) +{ + return connect(ip,port,WIFI_CLIENT_CONNECT_TIMEOUT_MS); +} +int WiFiClient::connect(IPAddress ip, uint16_t port, uint32_t timeout) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { log_e("socket: %d", errno); return 0; } + fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) | O_NONBLOCK ); uint32_t ip_addr = ip; struct sockaddr_in serveraddr; @@ -215,12 +221,21 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) serveraddr.sin_family = AF_INET; bcopy((const void *)(&ip_addr), (void *)&serveraddr.sin_addr.s_addr, 4); serveraddr.sin_port = htons(port); - int res = lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); - if (res < 0) { - log_e("lwip_connect_r: %d", errno); + fd_set fdset; + struct timeval tv; + FD_ZERO(&fdset); + FD_SET(sockfd, &fdset); + tv.tv_sec = 0; + tv.tv_usec = timeout * 1000; + lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); + int res = select(sockfd + 1, NULL, &fdset, NULL, &tv); + if (res != 1) + { + log_e("select: %d",errno); close(sockfd); return 0; } + fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) ); clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd)); _rxBuffer.reset(new WiFiClientRxBuffer(sockfd)); _connected = true; @@ -228,12 +243,16 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) } int WiFiClient::connect(const char *host, uint16_t port) +{ + return connect(host,port,WIFI_CLIENT_CONNECT_TIMEOUT_MS); +} +int WiFiClient::connect(const char *host, uint16_t port, uint32_t timeout) { IPAddress srv((uint32_t)0); if(!WiFiGenericClass::hostByName(host, srv)){ return 0; } - return connect(srv, port); + return connect(srv, port, timeout); } int WiFiClient::setSocketOption(int option, char* value, size_t len) diff --git a/libraries/WiFi/src/WiFiClient.h b/libraries/WiFi/src/WiFiClient.h index e87708f5cb8..04e2aa9ead9 100644 --- a/libraries/WiFi/src/WiFiClient.h +++ b/libraries/WiFi/src/WiFiClient.h @@ -41,7 +41,9 @@ class WiFiClient : public Client WiFiClient(int fd); ~WiFiClient(); int connect(IPAddress ip, uint16_t port); + int connect(IPAddress ip, uint16_t port, uint32_t timeout); int connect(const char *host, uint16_t port); + int connect(const char *host, uint16_t port, uint32_t timeout); size_t write(uint8_t data); size_t write(const uint8_t *buf, size_t size); size_t write_P(PGM_P buf, size_t size); From 89486bdcb360f06188f3a0a0f0ed527741f5df06 Mon Sep 17 00:00:00 2001 From: boarchuz Date: Sun, 27 Jan 2019 06:51:45 +1100 Subject: [PATCH 2/2] Changed default handling --- libraries/WiFi/src/WiFiClient.cpp | 11 +++++------ libraries/WiFi/src/WiFiClient.h | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libraries/WiFi/src/WiFiClient.cpp b/libraries/WiFi/src/WiFiClient.cpp index 974fe3c69e8..359e90b838b 100644 --- a/libraries/WiFi/src/WiFiClient.cpp +++ b/libraries/WiFi/src/WiFiClient.cpp @@ -25,7 +25,6 @@ #define WIFI_CLIENT_MAX_WRITE_RETRY (10) #define WIFI_CLIENT_SELECT_TIMEOUT_US (1000000) -#define WIFI_CLIENT_CONNECT_TIMEOUT_MS (60000) #define WIFI_CLIENT_FLUSH_BUFFER_SIZE (1024) #undef connect @@ -204,9 +203,9 @@ void WiFiClient::stop() int WiFiClient::connect(IPAddress ip, uint16_t port) { - return connect(ip,port,WIFI_CLIENT_CONNECT_TIMEOUT_MS); + return connect(ip,port,-1); } -int WiFiClient::connect(IPAddress ip, uint16_t port, uint32_t timeout) +int WiFiClient::connect(IPAddress ip, uint16_t port, int32_t timeout) { int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { @@ -228,7 +227,7 @@ int WiFiClient::connect(IPAddress ip, uint16_t port, uint32_t timeout) tv.tv_sec = 0; tv.tv_usec = timeout * 1000; lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); - int res = select(sockfd + 1, NULL, &fdset, NULL, &tv); + int res = select(sockfd + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv); if (res != 1) { log_e("select: %d",errno); @@ -244,9 +243,9 @@ int WiFiClient::connect(IPAddress ip, uint16_t port, uint32_t timeout) int WiFiClient::connect(const char *host, uint16_t port) { - return connect(host,port,WIFI_CLIENT_CONNECT_TIMEOUT_MS); + return connect(host,port,-1); } -int WiFiClient::connect(const char *host, uint16_t port, uint32_t timeout) +int WiFiClient::connect(const char *host, uint16_t port, int32_t timeout) { IPAddress srv((uint32_t)0); if(!WiFiGenericClass::hostByName(host, srv)){ diff --git a/libraries/WiFi/src/WiFiClient.h b/libraries/WiFi/src/WiFiClient.h index 04e2aa9ead9..09841f1a106 100644 --- a/libraries/WiFi/src/WiFiClient.h +++ b/libraries/WiFi/src/WiFiClient.h @@ -41,9 +41,9 @@ class WiFiClient : public Client WiFiClient(int fd); ~WiFiClient(); int connect(IPAddress ip, uint16_t port); - int connect(IPAddress ip, uint16_t port, uint32_t timeout); + int connect(IPAddress ip, uint16_t port, int32_t timeout); int connect(const char *host, uint16_t port); - int connect(const char *host, uint16_t port, uint32_t timeout); + int connect(const char *host, uint16_t port, int32_t timeout); size_t write(uint8_t data); size_t write(const uint8_t *buf, size_t size); size_t write_P(PGM_P buf, size_t size);