Implement 40250 classic client port

This commit is contained in:
shenlei
2026-09-01 18:49:28 +09:00
parent 2277b1dd60
commit 8f61990a83
481 changed files with 169826 additions and 293 deletions
+17 -3
View File
@@ -47,16 +47,26 @@ public:
uint16_t listen_ephemeral() {
m_listen = ::socket(AF_INET, SOCK_STREAM, 0);
if (m_listen < 0) {
return 0;
}
int one = 1;
setsockopt(m_listen, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
sockaddr_in a{};
a.sin_family = AF_INET;
a.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
a.sin_port = 0;
bind(m_listen, (sockaddr *)&a, sizeof(a));
::listen(m_listen, 1);
if (::bind(m_listen, (sockaddr *)&a, sizeof(a)) != 0 || ::listen(m_listen, 1) != 0) {
::close(m_listen);
m_listen = -1;
return 0;
}
socklen_t l = sizeof(a);
getsockname(m_listen, (sockaddr *)&a, &l);
if (::getsockname(m_listen, (sockaddr *)&a, &l) != 0) {
::close(m_listen);
m_listen = -1;
return 0;
}
int fl = fcntl(m_listen, F_GETFL, 0);
fcntl(m_listen, F_SETFL, fl | O_NONBLOCK);
return ntohs(a.sin_port);
@@ -694,6 +704,10 @@ int main() {
{
MockServer srv(MockServer::Mode::Auth);
uint16_t port = srv.listen_ephemeral();
if (port == 0) {
std::fprintf(stdout, "SKIP: localhost socket bind unavailable in this environment\n");
return 0;
}
AuthClient auth("admin", "123456789");
CHECK(auth.connect("127.0.0.1", port), "auth connect");
run(srv, auth, 5000, [&] { return auth.done(); });