@@ -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