提交 fc737e08 编写于 作者: B boarchuz 提交者: Me No Dev

Add connect timeout to WiFiClient (#2383)

* Add timeout to WiFiClient.connect()

* Changed default handling
上级 e302a684
...@@ -202,12 +202,17 @@ void WiFiClient::stop() ...@@ -202,12 +202,17 @@ void WiFiClient::stop()
} }
int WiFiClient::connect(IPAddress ip, uint16_t port) int WiFiClient::connect(IPAddress ip, uint16_t port)
{
return connect(ip,port,-1);
}
int WiFiClient::connect(IPAddress ip, uint16_t port, int32_t timeout)
{ {
int sockfd = socket(AF_INET, SOCK_STREAM, 0); int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) { if (sockfd < 0) {
log_e("socket: %d", errno); log_e("socket: %d", errno);
return 0; return 0;
} }
fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) | O_NONBLOCK );
uint32_t ip_addr = ip; uint32_t ip_addr = ip;
struct sockaddr_in serveraddr; struct sockaddr_in serveraddr;
...@@ -215,12 +220,21 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) ...@@ -215,12 +220,21 @@ int WiFiClient::connect(IPAddress ip, uint16_t port)
serveraddr.sin_family = AF_INET; serveraddr.sin_family = AF_INET;
bcopy((const void *)(&ip_addr), (void *)&serveraddr.sin_addr.s_addr, 4); bcopy((const void *)(&ip_addr), (void *)&serveraddr.sin_addr.s_addr, 4);
serveraddr.sin_port = htons(port); serveraddr.sin_port = htons(port);
int res = lwip_connect_r(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)); fd_set fdset;
if (res < 0) { struct timeval tv;
log_e("lwip_connect_r: %d", errno); 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, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv);
if (res != 1)
{
log_e("select: %d",errno);
close(sockfd); close(sockfd);
return 0; return 0;
} }
fcntl( sockfd, F_SETFL, fcntl( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) );
clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd)); clientSocketHandle.reset(new WiFiClientSocketHandle(sockfd));
_rxBuffer.reset(new WiFiClientRxBuffer(sockfd)); _rxBuffer.reset(new WiFiClientRxBuffer(sockfd));
_connected = true; _connected = true;
...@@ -228,12 +242,16 @@ int WiFiClient::connect(IPAddress ip, uint16_t port) ...@@ -228,12 +242,16 @@ int WiFiClient::connect(IPAddress ip, uint16_t port)
} }
int WiFiClient::connect(const char *host, uint16_t port) int WiFiClient::connect(const char *host, uint16_t port)
{
return connect(host,port,-1);
}
int WiFiClient::connect(const char *host, uint16_t port, int32_t timeout)
{ {
IPAddress srv((uint32_t)0); IPAddress srv((uint32_t)0);
if(!WiFiGenericClass::hostByName(host, srv)){ if(!WiFiGenericClass::hostByName(host, srv)){
return 0; return 0;
} }
return connect(srv, port); return connect(srv, port, timeout);
} }
int WiFiClient::setSocketOption(int option, char* value, size_t len) int WiFiClient::setSocketOption(int option, char* value, size_t len)
......
...@@ -41,7 +41,9 @@ public: ...@@ -41,7 +41,9 @@ public:
WiFiClient(int fd); WiFiClient(int fd);
~WiFiClient(); ~WiFiClient();
int connect(IPAddress ip, uint16_t port); int connect(IPAddress ip, uint16_t port);
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);
int connect(const char *host, uint16_t port, int32_t timeout);
size_t write(uint8_t data); size_t write(uint8_t data);
size_t write(const uint8_t *buf, size_t size); size_t write(const uint8_t *buf, size_t size);
size_t write_P(PGM_P buf, size_t size); size_t write_P(PGM_P buf, size_t size);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册