Click here to Skip to main content
15,891,657 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I want to create tcp server with select system call. When I connect to the server (I think I am at some level because when end server the client closes too) select gives me value of 0 readable descriptors? What is my mistake? This is the code:

int RelayServer::SendTcpPacket(uint8_t* payload, size_t len)
{
    int max_socket_so_far = 0;
    if(! server_is_set)
    {
        server_socket = SetupServer(port);
        server_is_set = true;
        cout<<"Relay server socket is set to: "<<server_socket<<endl;
    }

    conn_accepted = false;

        FD_ZERO(¤t_sockets);
        FD_SET(server_socket,¤t_sockets);
        
        if(FD_ISSET(server_socket, ¤t_sockets))
        {
            cout<<"Current socket is set with value of server_socket"<<endl;
        };

        max_socket_so_far = server_socket;

    while(! conn_accepted)
    {
        //beacause select is destructive
        ready_sockets = current_sockets;
        
        timeval tv;
        tv.tv_sec = 2;
        tv.tv_usec = 0;
        int numb_of_desc;
        numb_of_desc = select(max_socket_so_far,&ready_sockets, NULL, NULL, &tv);
        if(numb_of_desc < 0)
        {
            perror("select error");
        }
        cout<<"Number of descriptors ready to be read from is: "<<numb_of_desc<<endl;
        
        for(int i=0; i < max_socket_so_far;i++)
        {
            if(FD_ISSET(i, &ready_sockets))
            {
                if(i == server_socket){
                    //this is a new connection
                    cout<<"FOund server socket"<<endl;
                    client_socket = AcceptNewConnection(server_socket);
                    FD_SET(client_socket, ¤t_sockets);// add client socket to sockets which will be watching
                    if(client_socket > max_socket_so_far) {
                        max_socket_so_far = client_socket;
                    }  
                    conn_accepted = true;
                }
                else
                {
                    //do whatever we do with connections
                    int payload_ret =  HandleConnection(i,payload,len);
                    if(payload_ret != -1)
                    {
                        FD_CLR(i,¤t_sockets);
                        return payload_ret;
                    }
                    else
                    {
                        //close(client_socket);
                        //i = -1;
                        //continue;
                    }
                }
            }
        }
    }
    
    return 255;
}


What I have tried:

I tried to connect with ncat client to the server.
Also the client socket is in non-blocking mode if that matter somehow.
Posted
Updated 31-Oct-22 10:36am

1 solution

When calling select() the first argument should be the highest number file descriptor, plus 1
C++
numb_of_desc = select(max_socket_so_far + 1, &ready_sockets, NULL, NULL, &tv);
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900