Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> memory leak, closesocket не освобождает память 
:(
    Опции темы
cypok
Дата 1.5.2006, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



Не освобождается память и  hadles  при закрытие сокета.



 
PM MAIL   Вверх
cypok
Дата 1.5.2006, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



Мой класс .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
 
}
 
PM MAIL   Вверх
cozzzy
Дата 1.5.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.4.2006
Где: Харьков

Репутация: нет
Всего: нет



Я бы посоветовал не изобретать велосипедов, а использовать существующие библиотеки. 
В идеале - ACE 
PM MAIL   Вверх
cypok
Дата 1.5.2006, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



Ace не понравился , мне с конкретным примером разобраться надо. 
PM MAIL   Вверх
kirjanov
Дата 1.5.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

Репутация: нет
Всего: 15



cypok

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

просто если вызов connect() проваливается, то сокет больше не может использоваться, и его требуется закрыть 
PM MAIL   Вверх
cypok
Дата 1.5.2006, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



kirjanov
да нет, я вообще там в аксепте сижу... 
PM MAIL   Вверх
cypok
Дата 4.5.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 11.4.2006

Репутация: нет
Всего: нет



Проблема в ф-ии accept, подскажите что не так? 
PM MAIL   Вверх
gruy
Дата 5.5.2006, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 4.6.2004

Репутация: нет
Всего: 3



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

А где она в приведенном тобой коде? 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0661 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.