@@ -76,30 +76,68 @@ int start_ssl_client(sslclient_context *ssl_client, const char *host, uint32_t p
76
76
return -1 ;
77
77
}
78
78
79
+ fcntl ( ssl_client->socket , F_SETFL, fcntl ( ssl_client->socket , F_GETFL, 0 ) | O_NONBLOCK );
79
80
struct sockaddr_in serv_addr;
80
81
memset (&serv_addr, 0 , sizeof (serv_addr));
81
82
serv_addr.sin_family = AF_INET;
82
83
serv_addr.sin_addr .s_addr = srv;
83
84
serv_addr.sin_port = htons (port);
84
85
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
+ }
90
89
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
+ }
94
104
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 );
99
109
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
+ }
100
130
}
101
131
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
+
103
141
104
142
log_v (" Seeding the random number generator" );
105
143
mbedtls_entropy_init (&ssl_client->entropy_ctx );
0 commit comments