After 16 successful connections, calling NetLibSocketOpen returns 
netErrTooManyTCPConnections (0x124F). What is going wrong?

I implement the solution as described in <http://oasis.palm.com/dev/kb/faq/1425.cfm>  
and setting the linger option has no effect. Is anyone else having this problem with 
NetLib?

See the sample code below to see how to produce the problem. If you see anything wrong 
please let me know. This code consistently errors after 16 sockets have opened/closed 
regardless of how I set the Linger option. arg!

psudoecode is
//loop more than 16 times
        //diplay dialog indicating number of connections opened/closed
        //open socket
        //set linger option off or time to linger very low.
        //socket connect
        //close socket
        //sleep for 3 seconds
//end loop

void CIPTransport::test()
{

        Err error = 0;
        UInt8 x = 0;
        char IToABuffer[maxStrIToALen] = "";
        string_t msg;
        Int32 Timeout = 5 * SysTicksPerSecond();
        string_t errmsg; 
        
        // Ensures that we resolved the address successfully
        //ConfigureServerIPAddr()
        // and opening the NetLib has already occured before we get here.


        NetSocketAddrINType addrType;
        addrType.family = netSocketAddrINET;
        addrType.port   = NetHToNS(m_Port);  //m_Port was already set
        addrType.addr   = NetHToNL(m_ServerIPAddrHBO);  //m_ServerIPAddrHBO was 
already set

        while (true)
        {
                ::StrIToA(IToABuffer, x);
                msg = "Connecting number: ";
                msg += IToABuffer;
                //show a progress dialog box. implementation not given here
                ProgressDlg.UpdateProgressDlg(CTransportProgressDlg::eInitializingIF, 
msg.c_str());

                // Create a TCP/IP socket that is bound to the server.
                if (SOCKET_CLOSED == (m_NetSocket = ::NetLibSocketOpen(m_LibRefNum,
                                                                        
netSocketAddrINET, netSocketTypeStream,
                                                                        0, Timeout, 
&error)))
                {
                        errmsg = ErrString(error); 
                        DisplayMessage("NetLib socket open", errmsg);
                        return;
                }

                //disable lingering sockets to avoid netErrTooManyTCPConnections error 
(max is 16)
                //this will occur if you open/close sockets quickly before the linger 
time has expired
                //this does not work as the docs say. Still getting the error after 16 
connects
                //I have also tried turning onOff to false and still get the same 
error.
                NetSocketLingerType LingerOpt;
                LingerOpt.onOff = 1; //true means on
                LingerOpt.time = 3; //seconds. ignored if onOff is 0
                Int16 NetLibResponse = ::NetLibSocketOptionSet( m_LibRefNum
                                                                                       
         , m_NetSocket
                                                                                       
         , netSocketOptLevelSocket
                                                                                       
         , netSocketOptSockLinger
                                                                                       
         , &LingerOpt
                                                                                       
         , sizeof(LingerOpt)
                                                                                       
         , Timeout
                                                                                       
         , &error
                                                                                       
         );

                if (error)
                {
                        errmsg = ErrString(error);
                        DisplayMessage("NetLib options set", errmsg);
                        return;
                }

                //this line is where the error occurs after 16 loops.
                NetLibResponse = ::NetLibSocketConnect ( m_LibRefNum
                                                                , m_NetSocket
                                                                , (NetSocketAddrType*) 
&addrType
                                                                , sizeof(addrType)
                                                                , Timeout
                                                                , &error
                                                                );
                if (error)
                {
                        errmsg = ErrString(error);
                        DisplayMessage("NetLib connect", errmsg);
                        return;
                }

                NetLibResponse = ::NetLibSocketOptionSet( m_LibRefNum
                                                                                       
         , m_NetSocket
                                                                                       
         , netSocketOptLevelSocket
                                                                                       
         , netSocketOptSockLinger
                                                                                       
         , &LingerOpt
                                                                                       
         , sizeof(LingerOpt)
                                                                                       
         , Timeout
                                                                                       
         , &error
                                                                                       
         );

                if (error)
                {
                        errmsg = ErrString(error);
                        DisplayMessage("NetLib options set", errmsg);
                        return;
                }

                if (::NetLibSocketClose(m_LibRefNum, m_NetSocket, Timeout, &error))
                {
                        string_t msg(ErrString(error));
                        DisplayMessage("Close Connection", msg);
                        return;
                }

                m_NetSocket = -1;               
                //sleep for 3 seconds        
                        UInt32 now = TimGetSeconds();
                while( (TimGetSeconds() - now) < 2)
                {
                        //looping
                }

                x++;
        }

}




--
For information on using the Palm Developer Forums, or to unsubscribe, please see 
http://www.palmos.com/dev/tech/support/forums/

Reply via email to