@@ -226,14 +226,41 @@ int WiFiClient::connect(IPAddress ip, uint16_t port, int32_t timeout)
226
226
FD_SET (sockfd, &fdset);
227
227
tv.tv_sec = 0 ;
228
228
tv.tv_usec = timeout * 1000 ;
229
- lwip_connect_r (sockfd, (struct sockaddr *)&serveraddr, sizeof (serveraddr));
230
- int res = select (sockfd + 1 , nullptr , &fdset, nullptr , timeout<0 ? nullptr : &tv);
231
- if (res != 1 )
232
- {
233
- log_e (" select: %d" ,errno);
229
+
230
+ int res = lwip_connect_r (sockfd, (struct sockaddr *)&serveraddr, sizeof (serveraddr));
231
+ if (res < 0 && errno != EINPROGRESS) {
232
+ log_e (" connect on fd %d, errno: %d, \" %s\" " , sockfd, errno, strerror (errno));
233
+ close (sockfd);
234
+ return 0 ;
235
+ }
236
+
237
+ res = select (sockfd + 1 , nullptr , &fdset, nullptr , timeout<0 ? nullptr : &tv);
238
+ if (res < 0 ) {
239
+ log_e (" select on fd %d, errno: %d, \" %s\" " , sockfd, errno, strerror (errno));
240
+ close (sockfd);
241
+ return 0 ;
242
+ } else if (res == 0 ) {
243
+ log_i (" select returned due to timeout %d ms for fd %d" , timeout, sockfd);
234
244
close (sockfd);
235
245
return 0 ;
246
+ } else {
247
+ int sockerr;
248
+ socklen_t len = (socklen_t )sizeof (int );
249
+ res = getsockopt (sockfd, SOL_SOCKET, SO_ERROR, &sockerr, &len);
250
+
251
+ if (res < 0 ) {
252
+ log_e (" getsockopt on fd %d, errno: %d, \" %s\" " , sockfd, errno, strerror (errno));
253
+ close (sockfd);
254
+ return 0 ;
255
+ }
256
+
257
+ if (sockerr != 0 ) {
258
+ log_e (" socket error on fd %d, errno: %d, \" %s\" " , sockfd, sockerr, strerror (sockerr));
259
+ close (sockfd);
260
+ return 0 ;
261
+ }
236
262
}
263
+
237
264
fcntl ( sockfd, F_SETFL, fcntl ( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) );
238
265
clientSocketHandle.reset (new WiFiClientSocketHandle (sockfd));
239
266
_rxBuffer.reset (new WiFiClientRxBuffer (sockfd));
0 commit comments