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

  • Автор темы alexdrob
  • Дата начала
A

alexdrob

Гость
#1
У меня етсь класс 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: