1. Набираем команду codeby webinar. Набираем команду для организации и проведения вебинаров. Подробнее ...

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление
  3. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление

Завершение Работы Сокетов.

Тема в разделе "С и С++", создана пользователем alexdrob, 9 июн 2012.

  1. alexdrob

    alexdrob Гость

    Репутация:
    0
    У меня етсь класс SocketClient.
    В нём есть int socket;
    То есть ИД сокета.

    Добавление сокета
    Код:
    if (!epoll_ctl(_epfd, EPOLL_CTL_ADD, sock, &ev) < 0)
    Ожидание
    Код:
    if (int nfds = epoll_wait(_epfd, _events, MAX_EPOLL_EVENTS, -1))
    {
    for (int n = 0; n < nfds; ++n)
    {
    int fd = _events[n].data.fd;
    Lock();
    MapClients::iterator it = _clients.find(fd);
    UnLock();
    
    if (it != _clients.end() && (*it).second)
    {
    if (_events[n].events & EPOLLIN)
    (*it).second->onRead();
    Чтение
    Код:
    bool SocketClient::onRead()
    {
    int _len = MAX_BUFF;
    EMgr->onBeforeRead(this, _len);
    char buff[_len+1];
    int len = recv(_socket, buff, _len, 0);
    if (len > 0)
    {
    buff[len] = '\0';
    EMgr->onRead(this, buff, len);
    }
    else
    {
    EMgr->onErrorRead(this, errno);
    Log->Print(LOG_DEBUG, "Not readed data from socket: %i errno = %i", _socket, errno);
    return false;
    }
    завершение
    Код:
    void SocketClient::disconnect()
    {
    if (!epoll_ctl(_epfd, EPOLL_CTL_DEL, sock, &ev) < 0)
    {
    Log->Print(LOG_ERROR, "SocketThread::delClient epoll error");
    }
    shutdown(_socket, 2);
    close(_socket);
    delete this;
    Так вот, какая последовательность должа быть?
    Если клиент разорвал соединения, в recv я получаю -1 и errno = 0.
    я выполняю дисконект. Всё прозодит. Уничтодается объект, а в конце выводит сообщение
    Код:
     Debug: Not readed data from socket: -1211686512 errno = 0
    То есть, получается что объект уничтожаеть до того как выводится сообщение. И что то в памяти уже не там берётся и номер выводится случайный сокета...

    Как исправить?)

    Добавлено: Вопрос снят. Не учёл что вначале происходит удаление объекта, а потом вывод в лог :rolleyes: И выводит в лог уже не те данные.
    Код:
    		Log->Print(LOG_DEBUG, "Not readed data from socket: %i errno = %i", _socket, errno);
    EMgr->onErrorRead(this, errno);
    поменял местами строки и всё нормально стало :huh:
     
Загрузка...

Поделиться этой страницей