@@ -62,21 +62,32 @@ int start_ssl_client(sslclient_context *ssl_client, const IPAddress& ip, uint32_
62
62
return -1 ;
63
63
}
64
64
65
- log_v (" Starting socket" );
65
+ int domain = ip.type () == IPv6 ? AF_INET6 : AF_INET;
66
+ log_v (" Starting socket (domain %d)" , domain);
66
67
ssl_client->socket = -1 ;
67
68
68
- ssl_client->socket = lwip_socket (AF_INET , SOCK_STREAM, IPPROTO_TCP);
69
+ ssl_client->socket = lwip_socket (domain , SOCK_STREAM, IPPROTO_TCP);
69
70
if (ssl_client->socket < 0 ) {
70
71
log_e (" ERROR opening socket" );
71
72
return ssl_client->socket ;
72
73
}
73
74
74
75
fcntl ( ssl_client->socket , F_SETFL, fcntl ( ssl_client->socket , F_GETFL, 0 ) | O_NONBLOCK );
75
- struct sockaddr_in serv_addr;
76
- memset (&serv_addr, 0 , sizeof (serv_addr));
77
- serv_addr.sin_family = AF_INET;
78
- serv_addr.sin_addr .s_addr = ip;
79
- serv_addr.sin_port = htons (port);
76
+ struct sockaddr_storage serv_addr = {};
77
+ if (domain == AF_INET6) {
78
+ struct sockaddr_in6 *tmpaddr = (struct sockaddr_in6 *)&serv_addr;
79
+ tmpaddr->sin6_family = AF_INET6;
80
+ for (int index = 0 ; index < 16 ; index ++) {
81
+ tmpaddr->sin6_addr .s6_addr [index ] = ip[index ];
82
+ }
83
+ tmpaddr->sin6_port = htons (port);
84
+ tmpaddr->sin6_scope_id = ip.zone ();
85
+ } else {
86
+ struct sockaddr_in *tmpaddr = (struct sockaddr_in *)&serv_addr;
87
+ tmpaddr->sin_family = AF_INET;
88
+ tmpaddr->sin_addr .s_addr = ip;
89
+ tmpaddr->sin_port = htons (port);
90
+ }
80
91
81
92
if (timeout <= 0 ){
82
93
timeout = 30000 ; // Milli seconds.
0 commit comments