Or from a laptop terminal windowclient:connect('test-pc', 1984, 'admin', '...')(:will return id if can connect else error :)
basexclient -n test-pc -p1984
Happy retirement.
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