@@ -76,30 +76,67 @@ 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 ;
9496
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 );
99101 return -1 ;
100102 }
101103
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+
103140
104141 log_v (" Seeding the random number generator" );
105142 mbedtls_entropy_init (&ssl_client->entropy_ctx );
0 commit comments