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

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

  1. alexdrob

    alexdrob Гость

    У меня етсь класс SocketClient.
    В нём есть int socket;
    То есть ИД сокета.

    Добавление сокета
    Код (C++):
    if (!epoll_ctl(_epfd, EPOLL_CTL_ADD, sock, &ev) < 0)
    Ожидание
    Код (C++):
    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();
    Чтение
    Код (C++):
    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;
    }
    завершение
    Код (C++):
    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.
    я выполняю дисконект. Всё прозодит. Уничтодается объект, а в конце выводит сообщение
    Код (C++):
     Debug: Not readed data from socket: -1211686512 errno = 0
    То есть, получается что объект уничтожаеть до того как выводится сообщение. И что то в памяти уже не там берётся и номер выводится случайный сокета...

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

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

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