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

Reply via email to