Skip to content

Commit d5fdd71

Browse files
weinrankme-no-dev
authored andcommitted
WiFiClient.cpp - Fix connect() behavior (#2784)
* WiFiClient.cpp - Fix connect() behavior * lwip_connect_r() : check return code
1 parent ca7106e commit d5fdd71

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

libraries/WiFi/src/WiFiClient.cpp

+32-5
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)