@@ -226,14 +226,41 @@ int WiFiClient::connect(IPAddress ip, uint16_t port, int32_t timeout)
226226 FD_SET (sockfd, &fdset);
227227 tv.tv_sec = 0 ;
228228 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);
234244 close (sockfd);
235245 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+ }
236262 }
263+
237264 fcntl ( sockfd, F_SETFL, fcntl ( sockfd, F_GETFL, 0 ) & (~O_NONBLOCK) );
238265 clientSocketHandle.reset (new WiFiClientSocketHandle (sockfd));
239266 _rxBuffer.reset (new WiFiClientRxBuffer (sockfd));
0 commit comments