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/
