Задать вопрос
@famousman204

Почему разрывает соединение, при смене типа?

Добрый день!
Я написал свой класс:
ft::Socket::Socket(int fd) : _socket(fd) {}
ft::Socket::operator int() { return _socket; }

Данные в нем я никак не меняю.
Есть такой цикл, он просматривает ивенты с помощью kevent. На сколько я вижу код работает (но если ваш зоркий глаз заметил не ладное, буду рад комментарию), соединение устанавливается и клиенты висят без проблем. Но как только меняю тип у переменной fd все ломается. Точнее работает, примет одного клиента отдаст ему порцию данных и все, никто больше не подключится, да и клиента отключает.
for (int i = 0; i < newEvents; i++) {
			// Если здесь поменять int на ft::Socket
			int fd(tEvent[i].ident);
			std::cerr << fd << "\n";
			if (tEvent[i].flags & EV_EOF) {
					std::cerr << "Connection close from remote host\n";
				close((int)fd);
			} else if (fd == _hostSock) {
				std::cerr << "New connection ";
				struct sockaddr_storage	remoteAdr;
				socklen_t size = sizeof(remoteAdr);
				int newSock = accept((int)fd, (struct sockaddr *)&remoteAdr, &size);
				if (newSock == -1)
					std::cerr << "error: Cant accept new connection\n";
				EV_SET(&event, newSock, EVFILT_READ, EV_ADD, 0, 0, NULL);
				kevent(kq, &event, 1, NULL, 0, NULL);
				std::cerr << "connection accepted\n";
				int flags = fcntl(newSock, F_GETFL, 0);
				if (fcntl(newSock, F_SETFL, flags | O_NONBLOCK) < 0)
					std::cerr << "Cant set socket to nonblock statement";
				EV_SET(&event, newSock, EVFILT_WRITE, EV_ADD | EV_ONESHOT, 0, 0, NULL);
				kevent(kq, &event, 1, NULL, 0, NULL);

Как это исправить?
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Простой 13 комментариев
Решения вопроса 1
@famousman204 Автор вопроса
Все решил. У меня в деструкторе стоял close(fd). Соответственно при выходе из зоны видимости класс вызывает деструктор и все. Получается вроде как сокет находится в очереди, а он уже закрыт.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы