Hi Ben,

I can't speak to any C++ issues, but you might check if this is not just a permissions or network/firewall issue by:

From the BaseX GUI on your laptop, execute:
client:connect('test-pc', 1984, 'admin', '...')   (:will return id if can connect else error :)
Or from a laptop terminal window
basexclient -n test-pc -p1984
Happy retirement.

/Andy


 


On Mon, 26 Jan 2026 at 16:37, Ben Engbers via BaseX-Talk <basex-talk@mailman.uni-konstanz.de> wrote:
Hi,

Thanks to an increasing number of grandchildren, as a retiree I have had
little time in recent years to continue working on my C++ client for
Basex. It therefore took a lot of time to find and fix a very persistent
memory leak, but I finally succeeded.
On a local machine, running basexserver, the entire server protocol can
be handled without error messages. The only thing I couldn't test yet
was the use of a websocket to a remote machine, and that now appears to
be causing problems.
On an old PC, I installed a minimal version of Fedora 43 that does not
use GNOME. Basexserver runs without any problems and I can create new
users in basexclient. Local use of my client does not cause any
problems. But when I want to create a websocket to the test machine, I
get the error message “setsockopt: Bad file descriptor”. After several
attempts using the IP address instead of the machine name, both my
laptop and the test PC crashed, and I had to reinstall basex.
In C++, I use the following code to create a socket (the starting point
for this code was Alexander Holupirek's C code “basexdbc.c”):

BasexSocket & BasexSocket::CreateSocket (string host, string port) { //
@suppress("Name convention for function")
        cout << __FUNCTION__ << " : " << host <<  " | " << port << " | " << endl;
                if (host.empty () || port.empty ()) {
                cout << "ERROR: Invalid hostname/port\n" << endl;
                exit(0);
        }
/*
if (host.empty () || port.empty ()) {
        Master_sfd = -1;
        return *this;
}
*/

struct addrinfo hints;
struct addrinfo * result = NULL, *rp;
memset (&hints, 0, sizeof (struct addrinfo));   // Initialize hints
hints.ai_family = AF_INET;                      // Accept both AF_INET and AF_INET6
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_NUMERICSERV;        // Port must be specified as number

int rc;
rc = getaddrinfo (host.c_str (), port.c_str (), &hints, &result);
if (rc != 0)
        perror (gai_strerror (rc));

for (rp = result; rp != NULL; rp = rp->ai_next) {       // result is a linked
list of address structures.
Master_sfd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (Master_sfd == -1)
        continue;
if (connect (Master_sfd, rp->ai_addr, rp->ai_addrlen) != -1)
        break;                                                                          // Try to connect. Return the first successfull connect
or abort
close (Master_sfd);
}
set_nonblock_flag (Master_sfd, 1);
int opt = true;
if (setsockopt
(Master_sfd, SOL_SOCKET, SO_REUSEADDR, (char *) &opt, sizeof (opt)) < 0)
{
        perror ("setsockopt");
        exit (EXIT_FAILURE);
}
if (rp == NULL) {
        warnx ("Can not connect to Basex server");
}
freeaddrinfo (result);
cout << "Master_sfd: " << Master_sfd << endl;
return *this;
};

Can anyone explain to me how I can successfully build a websocket to the
test PC?

Ben