Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2014, 18:48   #1
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию проблема с деструктором

Есть класс BaseSocket
вот его деструктор:

Код:
BaseSocket::~BaseSocket() {

  closesocket(base_socket_);

}
класс TftpServer включает в себя объект BaseSocket. Вот деструктор TftpServer'a:
Код:
TftpServer::~TftpServer() {

}
вопрос:
Почему деструктор TftpServer'a вызывается очень быстро. Сразу после того как присойденился клиент. И как результат соеденения закрывается потому что вызывается деструктор BaseSocket.
Если сделать деструктор BaseSocket пустыт то все работает.
Pein95 вне форума Ответить с цитированием
Старый 26.03.2014, 21:14   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

А как мы скажем почему, не видя кода? )
Son Of Pain вне форума Ответить с цитированием
Старый 27.03.2014, 01:38   #3
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

Код:
void TftpServer::ChooseAction() {
  string rmessage;
  string smessage;
  while(true) {
    if (!RecvMessage(rmessage)) {
      cout << "... CLIENT DISCONNECT\n";
      break;
    }
   
    std::vector<std::string> request_param;
    int count_param = ParseRequest(rmessage, request_param);
    if(count_param == 0) {
      cout << "... ERROR COMMAND\n";
      break;
    }

    cout << ">>> " << rmessage << endl;
    //get code command
    int code_command = std::stoi(request_param[0]);
    switch (code_command)
    {
      //client want download file
      case 0: {
        //check second parameters in request
        //if  it did not exist 
        if (request_param.size() < 2) {
          cout << "... UNKNOWN FILE NAME\n";

          //send message to client about error
          smessage += GetCodeCommandStr(ERROR);

          //server_.SendData(smessage);
          if (!SendMessage(smessage)) {
            cout << "... CLIENT DISCONNECT\n";
          }

          break;
        }

        //send message about successful or error and after that send file
        else {
          if (!SendFile(request_param[1])) {
            cout << "... ERROR SEND FILE\n";
          }
          break;
       }

      }
      //client want to upload file
      case 1: {
        //check second parameters in request
        if (request_param.size() < 2) {
          cout << "... UNKNOWN FILE NAME\n";
           //send message to client about error
          smessage += GetCodeCommandStr(ERROR);
          if(!SendMessage(smessage)) {
            cout << "... CLIENT DISCONNECT\n";
          }
          break;
        }

        //send message about successful or error and after that upload file
        else {
          if (!RecvFile(request_param[1])) {
            cout <<"... ERROR RECEIVING FILE\n";
            
          }
          break;
      }
      default:
        break;
      }
    }
    rmessage = "";
    smessage = "";
  }

}
после выделенной строки вызвается деструктор TftpServer.
Pein95 вне форума Ответить с цитированием
Старый 27.03.2014, 02:19   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

код применения класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.03.2014, 02:58   #5
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

Код:
TftpClient client(AF_INET, SOCK_STREAM, IPPROTO_TCP, "127.0.0.1", 1000);
client.Start();
Pein95 вне форума Ответить с цитированием
Старый 27.03.2014, 03:13   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а посл start блок не заканчивается?
помоему у вас именно уничтожается объект потому что не там создали.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.03.2014, 03:20   #7
Pein95
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 881
По умолчанию

исправил, но деструктор вызывается дальше.

Последний раз редактировалось Pein95; 27.03.2014 в 03:28.
Pein95 вне форума Ответить с цитированием
Старый 27.03.2014, 22:51   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

телепаты в отпуске.
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
Проблема с деструктором при выводе массива WebbMan Общие вопросы C/C++ 6 28.03.2011 22:23
Ошибка с деструктором окна (glut) Познающий Помощь студентам 0 18.09.2010 22:45
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37