8000 WiFiClient.cpp - Fix connect() behavior (#2784) · shuaidi/arduino-esp32@d5fdd71 · GitHub
[go: up one dir, main page]

Skip to content

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d5fdd71

Browse files
weinrankme-no-dev
authored andcommitted
WiFiClient.cpp - Fix connect() behavior (espressif#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

Lines changed: 32 additions & 5 deletions
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)
0