Skip to content

Commit a087d47

Browse files
committed
fix: WiFiClientSecure connection timeout (espressif#5398)
1 parent f64ca2e commit a087d47

File tree

1 file changed

+51
-13
lines changed

1 file changed

+51
-13
lines changed

Diff for: libraries/WiFiClientSecure/src/ssl_client.cpp

+51-13
Original file line numberDiff line numberDiff line change
@@ -76,30 +76,68 @@ int start_ssl_client(sslclient_context *ssl_client, const char *host, uint32_t p
7676
return -1;
7777
}
7878

79+
fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
7980
struct sockaddr_in serv_addr;
8081
memset(&serv_addr, 0, sizeof(serv_addr));
8182
serv_addr.sin_family = AF_INET;
8283
serv_addr.sin_addr.s_addr = srv;
8384
serv_addr.sin_port = htons(port);
8485

85-
if (lwip_connect(ssl_client->socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == 0) {
86-
if(timeout <= 0){
87-
timeout = 30000; // Milli seconds.
88-
}
89-
timeval so_timeout = { .tv_sec = timeout / 1000, .tv_usec = (timeout % 1000) * 1000 };
86+
if(timeout <= 0){
87+
timeout = 30000; // Milli seconds.
88+
}
9089

91-
#define ROE(x,msg) { if (((x)<0)) { log_e("LWIP Socket config of " msg " failed."); return -1; }}
92-
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_RCVTIMEO, &so_timeout, sizeof(so_timeout)),"SO_RCVTIMEO");
93-
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_SNDTIMEO, &so_timeout, sizeof(so_timeout)),"SO_SNDTIMEO");
90+
fd_set fdset;
91+
struct timeval tv;
92+
FD_ZERO(&fdset);
93+
FD_SET(ssl_client->socket, &fdset);
94+
tv.tv_sec = timeout / 1000;
95+
tv.tv_usec = (timeout % 1000) * 1000;
96+
97+
//int res = lwip_connect(ssl_client->socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
98+
int res = lwip_connect_r(ssl_client->socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
99+
if (res < 0 && errno != EINPROGRESS) {
100+
log_e("connect on fd %d, errno: %d, \"%s\"", ssl_client->socket, errno, strerror(errno));
101+
close(ssl_client->socket);
102+
return -1;
103+
}
94104

95-
ROE(lwip_setsockopt(ssl_client->socket, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable)),"TCP_NODELAY");
96-
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable)),"SO_KEEPALIVE");
97-
} else {
98-
log_e("Connect to Server failed!");
105+
res = select(ssl_client->socket + 1, nullptr, &fdset, nullptr, timeout<0 ? nullptr : &tv);
106+
if (res < 0) {
107+
log_e("select on fd %d, errno: %d, \"%s\"", ssl_client->socket, errno, strerror(errno));
108+
close(ssl_client->socket);
99109
return -1;
110+
} else if (res == 0) {
111+
log_i("select returned due to timeout %d ms for fd %d", timeout, ssl_client->socket);
112+
close(ssl_client->socket);
113+
return -1;
114+
} else {
115+
int sockerr;
116+
socklen_t len = (socklen_t)sizeof(int);
117+
res = getsockopt(ssl_client->socket, SOL_SOCKET, SO_ERROR, &sockerr, &len);
118+
119+
if (res < 0) {
120+
log_e("getsockopt on fd %d, errno: %d, \"%s\"", ssl_client->socket, errno, strerror(errno));
121+
close(ssl_client->socket);
122+
return -1;
123+
}
124+
125+
if (sockerr != 0) {
126+
log_e("socket error on fd %d, errno: %d, \"%s\"", ssl_client->socket, sockerr, strerror(sockerr));
127+
close(ssl_client->socket);
128+
return -1;
129+
}
100130
}
101131

102-
fcntl( ssl_client->socket, F_SETFL, fcntl( ssl_client->socket, F_GETFL, 0 ) | O_NONBLOCK );
132+
133+
#define ROE(x,msg) { if (((x)<0)) { log_e("LWIP Socket config of " msg " failed."); return -1; }}
134+
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)),"SO_RCVTIMEO");
135+
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv)),"SO_SNDTIMEO");
136+
137+
ROE(lwip_setsockopt(ssl_client->socket, IPPROTO_TCP, TCP_NODELAY, &enable, sizeof(enable)),"TCP_NODELAY");
138+
ROE(lwip_setsockopt(ssl_client->socket, SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof(enable)),"SO_KEEPALIVE");
139+
140+
103141

104142
log_v("Seeding the random number generator");
105143
mbedtls_entropy_init(&ssl_client->entropy_ctx);

0 commit comments

Comments
 (0)