Hi
basexclient -n test-pc -p 1984 failed so probably the problems are in
the interface.
Tomorrow I'll continue my search.
Ben
Op 26-01-2026 om 20:53 schreef Andy Bunce via BaseX-Talk:
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-
[email protected] <mailto:[email protected]
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
--
Ben Engbers
Grietjeshof 77
6721 VH Bennekom
+31 6 23634840