Implement 40250 classic client port
This commit is contained in:
@@ -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(); });
|
||||
|
||||
Reference in New Issue
Block a user