Jump to content

  • Log In with Google      Sign In   
  • Create Account


#Actualadrian_134

Posted 08 July 2013 - 12:08 PM

Hi!

 

I have a few questions about select function, i wrote this code:

void TCPSerwer::sel()
    {
        struct timeval tv = {1, 0};
        fd_set temp_list = m_RecvList;
        //if(select(m_fdmax + 1, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
        if(select(0, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
        {
            perror( "select" );
            exit( 1 );
        }
        
        for(int i = 0; i <= m_fdmax; i++ )
        {
            if(FD_ISSET(i, &temp_list))
            {
                // New connection
                if(i == m_ListenSocket)
                {
                    acceptClient();
                }

                // Data from client
                else
                {
                    PacketHeader header;
                    int nbytes = recv(i, (char*)(&header), sizeof(PacketHeader),

                    // Error
                    if(nbytes < 0)
                    {
                        disconnectClient(i);
                    }
                    // success
                    else
                    {
                        std::cout << "type: " << header.type << "   len: " << header.length << std::endl;
                    }
                }
            }
        }
    }

I can give first arg to select function and i can don't do that, but why ? Why a should give first arg to select ? m_fdmax is highest number of socket, but this code working without this arg.

Next question is, why select need timeout ? When i don't give this arg select marks all socket as socket that can be readable but select doing this when socket haven't any data to read. When i give this arg i don't have this problem. But why ?

 

if m_fdmax is highest number of socket, i have to find next highest number of socket when i close connection, Right ? And i should doing this that:

int size = m_ClientVector.size();
for(int i = 0; i < size; i++)
{
       if(m_ClientVector[i] > m_fdmax)
               m_fdmax = m_ClientVector[i];
}

#1adrian_134

Posted 08 July 2013 - 11:02 AM

Hi!

 

I have a few question about select function, i wrote this code:

void TCPSerwer::sel()
    {
        struct timeval tv = {1, 0};
        fd_set temp_list = m_RecvList;
        //if(select(m_fdmax + 1, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
        if(select(0, &temp_list, NULL, NULL, &tv) == SOCKET_ERROR)
        {
            perror( "select" );
            exit( 1 );
        }
        
        for(int i = 0; i <= m_fdmax; i++ )
        {
            if(FD_ISSET(i, &temp_list))
            {
                // New connection
                if(i == m_ListenSocket)
                {
                    acceptClient();
                }

                // Data from client
                else
                {
                    PacketHeader header;
                    int nbytes = recv(i, (char*)(&header), sizeof(PacketHeader),

                    // Error
                    if(nbytes < 0)
                    {
                        disconnectClient(i);
                    }
                    // success
                    else
                    {
                        std::cout << "type: " << header.type << "   len: " << header.length << std::endl;
                    }
                }
            }
        }
    }

I can give first arg to select function and i can don't do that, but why ? Why a should give first arg to select ? m_fdmax is highest number of socket, but this code working without this arg.

Next question is, why select need timeout ? When i don't give this arg select marks all socket as socket that can be readable but select doing this when socket haven't any data to read. When i give this arg i don't have this problem. But why ?

 

if m_fdmax is highest number of socket, i have to find next highest number of socket when i close connection, Right ? And i should doing this that:

int size = m_ClientVector.size();
for(int i = 0; i < size; i++)
{
       if(m_ClientVector[i] > m_fdmax)
               m_fdmax = m_ClientVector[i];
}

PARTNERS