@@ -76,30 +76,67 @@ 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 ;
94
96
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! " );
97
+ int res = lwip_connect ( ssl_client->socket , ( struct sockaddr *)&serv_addr , sizeof (serv_addr) );
98
+ if (res < 0 && errno != EINPROGRESS) {
99
+ log_e ( " connect on fd %d, errno: %d, \" %s \" " , ssl_client-> socket , errno, strerror (errno));
100
+ close (ssl_client-> socket );
99
101
return -1 ;
100
102
}
101
103
102
- fcntl ( ssl_client->socket , F_SETFL, fcntl ( ssl_client->socket , F_GETFL, 0 ) | O_NONBLOCK );
104
+ res = select (ssl_client->socket + 1 , nullptr , &fdset, nullptr , timeout<0 ? nullptr : &tv);
105
+ if (res < 0 ) {
106
+ log_e (" select on fd %d, errno: %d, \" %s\" " , ssl_client->socket , errno, strerror (errno));
107
+ close (ssl_client->socket );
108
+ return -1 ;
109
+ } else if (res == 0 ) {
110
+ log_i (" select returned due to timeout %d ms for fd %d" , timeout, ssl_client->socket );
111
+ close (ssl_client->socket );
112
+ return -1 ;
113
+ } else {
114
+ int sockerr;
115
+ socklen_t len = (socklen_t )sizeof (int );
116
+ res = getsockopt (ssl_client->socket , SOL_SOCKET, SO_ERROR, &sockerr, &len);
117
+
118
+ if (res < 0 ) {
119
+ log_e (" getsockopt on fd %d, errno: %d, \" %s\" " , ssl_client->socket , errno, strerror (errno));
120
+ close (ssl_client->socket );
121
+ return -1 ;
122
+ }
123
+
124
+ if (sockerr != 0 ) {
125
+ log_e (" socket error on fd %d, errno: %d, \" %s\" " , ssl_client->socket , sockerr, strerror (sockerr));
126
+ close (ssl_client->socket );
127
+ return -1 ;
128
+ }
129
+ }
130
+
131
+
132
+ #define ROE (x,msg ) { if (((x)<0 )) { log_e (" LWIP Socket config of " msg " failed." ); return -1 ; }}
133
+ ROE (lwip_setsockopt (ssl_client->socket , SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof (tv))," SO_RCVTIMEO" );
134
+ ROE (lwip_setsockopt (ssl_client->socket , SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof (tv))," SO_SNDTIMEO" );
135
+
136
+ ROE (lwip_setsockopt (ssl_client->socket , IPPROTO_TCP, TCP_NODELAY, &enable, sizeof (enable))," TCP_NODELAY" );
137
+ ROE (lwip_setsockopt (ssl_client->socket , SOL_SOCKET, SO_KEEPALIVE, &enable, sizeof (enable))," SO_KEEPALIVE" );
138
+
139
+
103
140
104
141
log_v (" Seeding the random number generator" );
105
142
mbedtls_entropy_init (&ssl_client->entropy_ctx );
0 commit comments