From 1ab32bce2ff74f4e9d7428a969d3bb87dba298f0 Mon Sep 17 00:00:00 2001 From: nlattice <280584158+nlattice@users.noreply.github.com> Date: Mon, 4 May 2026 11:41:02 +0000 Subject: [PATCH] feat(wish/cpp): make benchmark clients able to accept IPv6 addresses and host names --- wish/cpp/benchmark/client.cc | 27 +++++++++++++++----------- wish/cpp/benchmark/high_qps_client.cc | 27 +++++++++++++++----------- wish/cpp/benchmark/tls_client.cc | 28 ++++++++++++++++----------- 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/wish/cpp/benchmark/client.cc b/wish/cpp/benchmark/client.cc index 0c4b1b7..41b30a3 100644 --- a/wish/cpp/benchmark/client.cc +++ b/wish/cpp/benchmark/client.cc @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -49,30 +50,34 @@ bool InitConnection(ClientState* client) { return false; } - struct sockaddr_in sin; - std::memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(absl::GetFlag(FLAGS_port)); - const std::string host = absl::GetFlag(FLAGS_host); - - if (inet_pton(AF_INET, host.c_str(), &sin.sin_addr) != 1) { - LOG(ERROR) << "Invalid IPv4 host: " << host; + const std::string port_str = std::to_string(absl::GetFlag(FLAGS_port)); + + struct addrinfo hints{}; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + struct addrinfo* res = nullptr; + const int gai_err = getaddrinfo(host.c_str(), port_str.c_str(), &hints, &res); + if (gai_err != 0) { + LOG(ERROR) << "getaddrinfo failed for " << host << ": " + << gai_strerror(gai_err); return false; } client->bev = bufferevent_socket_new(client->base, -1, BEV_OPT_CLOSE_ON_FREE); if (!client->bev) { LOG(ERROR) << "bufferevent_socket_new() failed"; + freeaddrinfo(res); return false; } - if (bufferevent_socket_connect(client->bev, - reinterpret_cast(&sin), - sizeof(sin)) < 0) { + if (bufferevent_socket_connect(client->bev, res->ai_addr, + static_cast(res->ai_addrlen)) < 0) { LOG(ERROR) << "bufferevent_socket_connect() failed"; + freeaddrinfo(res); return false; } + freeaddrinfo(res); client->handler = new WishHandler(client->bev, false); client->handler->SetOnOpen([client]() { diff --git a/wish/cpp/benchmark/high_qps_client.cc b/wish/cpp/benchmark/high_qps_client.cc index c24e95c..0cabb7c 100644 --- a/wish/cpp/benchmark/high_qps_client.cc +++ b/wish/cpp/benchmark/high_qps_client.cc @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -167,30 +168,34 @@ bool InitConnection(ClientState* client) { return false; } - struct sockaddr_in sin; - std::memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(absl::GetFlag(FLAGS_port)); - const std::string host = absl::GetFlag(FLAGS_host); - - if (inet_pton(AF_INET, host.c_str(), &sin.sin_addr) != 1) { - LOG(ERROR) << "Invalid IPv4 host: " << host; + const std::string port_str = std::to_string(absl::GetFlag(FLAGS_port)); + + struct addrinfo hints{}; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + struct addrinfo* res = nullptr; + const int gai_err = getaddrinfo(host.c_str(), port_str.c_str(), &hints, &res); + if (gai_err != 0) { + LOG(ERROR) << "getaddrinfo failed for " << host << ": " + << gai_strerror(gai_err); return false; } client->bev = bufferevent_socket_new(client->base, -1, BEV_OPT_CLOSE_ON_FREE); if (!client->bev) { LOG(ERROR) << "bufferevent_socket_new() failed"; + freeaddrinfo(res); return false; } - if (bufferevent_socket_connect(client->bev, - reinterpret_cast(&sin), - sizeof(sin)) < 0) { + if (bufferevent_socket_connect(client->bev, res->ai_addr, + static_cast(res->ai_addrlen)) < 0) { LOG(ERROR) << "bufferevent_socket_connect() failed"; + freeaddrinfo(res); return false; } + freeaddrinfo(res); client->handler = new WishHandler(client->bev, false); client->handler->SetOnOpen([client]() { diff --git a/wish/cpp/benchmark/tls_client.cc b/wish/cpp/benchmark/tls_client.cc index ae58709..8edbe23 100644 --- a/wish/cpp/benchmark/tls_client.cc +++ b/wish/cpp/benchmark/tls_client.cc @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -63,21 +64,24 @@ bool InitConnection(ClientState* client) { return false; } - struct sockaddr_in sin; - std::memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = htons(absl::GetFlag(FLAGS_port)); - const std::string host = absl::GetFlag(FLAGS_host); - - if (inet_pton(AF_INET, host.c_str(), &sin.sin_addr) != 1) { - LOG(ERROR) << "Invalid IPv4 host: " << host; + const std::string port_str = std::to_string(absl::GetFlag(FLAGS_port)); + + struct addrinfo hints{}; + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + struct addrinfo* res = nullptr; + const int gai_err = getaddrinfo(host.c_str(), port_str.c_str(), &hints, &res); + if (gai_err != 0) { + LOG(ERROR) << "getaddrinfo failed for " << host << ": " + << gai_strerror(gai_err); return false; } SSL* ssl = SSL_new(g_tls_ctx->ssl_ctx()); if (!ssl) { LOG(ERROR) << "SSL_new() failed"; + freeaddrinfo(res); return false; } @@ -86,15 +90,17 @@ bool InitConnection(ClientState* client) { if (!client->bev) { LOG(ERROR) << "bufferevent_openssl_socket_new() failed"; SSL_free(ssl); + freeaddrinfo(res); return false; } - if (bufferevent_socket_connect(client->bev, - reinterpret_cast(&sin), - sizeof(sin)) < 0) { + if (bufferevent_socket_connect(client->bev, res->ai_addr, + static_cast(res->ai_addrlen)) < 0) { LOG(ERROR) << "bufferevent_socket_connect() failed"; + freeaddrinfo(res); return false; } + freeaddrinfo(res); client->handler = new WishHandler(client->bev, false); client->handler->SetOnOpen([client]() {