Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > memory leak


Автор: cypok 1.5.2006, 10:42
Не освобождается память и  hadles  при закрытие сокета.



 

Автор: cypok 1.5.2006, 11:08
Мой класс .h

Код

class Socket
{
public:
     Socket();
    virtual ~Socket();
    
public:
    virtual bool     Connect(const char* pHost, int Port);
    
   virtual int      Send(char *pBuff, int Length);
    
    virtual int      Recv(char *pBuff, int Length);
    
    virtual bool     Close();

   virtual bool     Shutdown();

public:    
    SOCKET* GetHandle() { return &m_Socket; }

     const bool& IsInitialized() { return m_IsInitialized; }

protected: 
    bool InitSockaddr(const char *pHostname, int Port);
    
protected: 
     SOCKET   m_Socket;
      int m_Port;
     struct sockaddr_in m_SockAddr;
     bool m_IsInitialized;
    
private: 
    void Init(bool toCreate);
        
};


.cpp

Код


Socket::Socket()
{
    ClientIp = NULL;
    m_IsInitialized = true;
    if( -1 == (m_Socket = socket( AF_INET, SOCK_STREAM, 0)))
            m_IsInitialized = false;
}


//: default destructor ://
Socket::~Socket()
{
    if(!Close())
        cout << "Close socket error : " << WSAGetLastError() <<endl;
}

//: recv function ://
int
Socket::Recv(char *buff, int length)
{
    if(!m_IsInitialized)
    {
        WSAGetLastError();
        return -1;
    }
    return recv(m_Socket,buff,length,0);
}

//: send function ://

int
Socket::Send(char *buff, int length)
{
    if(!m_IsInitialized)
    {
        WSAGetLastError();
        return -1;
    }
    
    return send(m_Socket,buff,length,0);
}

//: connect to ip , port function ://
bool
Socket::Connect(const char* host, int port)
{
    if(!m_IsInitialized || 
        !InitSockaddr(host,port))
    {
        WSAGetLastError();
        return false;
    }
    
    if (connect(m_Socket, (struct sockaddr *)&m_SockAddr, sizeof(m_SockAddr)) < 0)
    {
        WSAGetLastError();
        return false;
    }
    return true;
}

//: close socket ://
bool
Socket::Close()
{
    if(!m_IsInitialized)
    {
        WSAGetLastError();
        return false;
    } 
#ifdef WIN32
    if(closesocket(m_Socket))
        return false;
    return true;
#elif LINUX
    close(m_Socket);
#endif
    m_IsInitialized = false;
}


//: init struct sockaddr ://
bool
Socket::InitSockaddr(const char *hostname, int port)
{
    struct hostent *l_pHostinfo;
    
    m_SockAddr.sin_family = AF_INET;
    m_SockAddr.sin_port = htons (port);

    if(!hostname)
        m_SockAddr.sin_addr.s_addr = htonl (INADDR_ANY);
    else
    {
        l_pHostinfo = gethostbyname (hostname);
        if (l_pHostinfo == NULL)
        {
            WSAGetLastError();
            return false;
        }
        m_SockAddr.sin_addr = *(struct in_addr *) l_pHostinfo->h_addr;
    }
    l_pHostinfo =NULL;
    return true;
}


//: function disables sends or receives on a socket ://
bool 
Socket::Shutdown()
{

#ifdef WIN32
if(shutdown(m_Socket,0))
 {
   WSAGetLastError();
    return false;
 }
 return true;
#endif
#ifdef LINUX
 if(shutdown(m_Socket,SHUT_RDWR))
 {
   return false;
 }
 return true;
#endif
 
}
 

Автор: cozzzy 1.5.2006, 17:13
Я бы посоветовал не изобретать велосипедов, а использовать существующие библиотеки. 
В идеале - ACE 

Автор: cypok 1.5.2006, 17:59
Ace не понравился , мне с конкретным примером разобраться надо. 

Автор: kirjanov 1.5.2006, 18:51
cypok

а у тебя connect() не  вызывается несколько раз, например, в цикле?

просто если вызов connect() проваливается, то сокет больше не может использоваться, и его требуется закрыть 

Автор: cypok 1.5.2006, 19:04
kirjanov
да нет, я вообще там в аксепте сижу... 

Автор: cypok 4.5.2006, 11:36
Проблема в ф-ии accept, подскажите что не так? 

Автор: gruy 5.5.2006, 08:58
Цитата(cypok @  4.5.2006,  11:36 Найти цитируемый пост)
Проблема в ф-ии accept

А где она в приведенном тобой коде? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)