Пример #1
0
	bool SocketList::removeSocket(const Socket &sock)
	{
		if (false == is_created() )
		{
			return false;
		}

	#ifdef WIN32
		for (size_t i = 0; i < poll_events.size(); ++i)
		{
			if (sock.get_handle() == poll_events[i].fd)
			{
				poll_events.erase(poll_events.begin() + i);
				return true;
			}
		}

		return false;
	#elif POSIX
		const int result = ::epoll_ctl(this->obj_list, EPOLL_CTL_DEL, sock.get_handle(), nullptr);

		if (result == ~0)
		{
			return false;
		}

		this->epoll_events.pop_back();

		return true;
	#else
		#error "Undefine platform"
	#endif
	}
Пример #2
0
	bool SocketList::recv(std::vector<Socket> &sockets, std::vector<Socket> &disconnected, std::chrono::milliseconds timeout) const
	{
		if (false == is_created() )
		{
			return false;
		}

	#ifdef WIN32
		const int count = ::WSAPoll(this->poll_events.data(), static_cast<::ULONG>(this->poll_events.size() ), static_cast<::INT>(timeout.count() ) );

		if (SOCKET_ERROR == count)
		{
			return false;
		}

		for (size_t i = 0; i < this->poll_events.size(); ++i)
		{
			const WSAPOLLFD &event = this->poll_events[i];

			if (event.revents & POLLRDNORM)
			{
				sockets.emplace_back(Socket(event.fd) );
			}
			else if (event.revents & POLLHUP)
			{
				disconnected.emplace_back(Socket(event.fd) );
			}
		}

		return false == sockets.empty() || false == disconnected.empty();
	#elif POSIX
		const int count = ::epoll_wait(this->obj_list, this->epoll_events.data(), this->epoll_events.size(), timeout.count() );

		if (count == ~0)
		{
			return false;
		}

		for (int i = 0; i < count; ++i)
		{
			const epoll_event &event = this->epoll_events[i];

			if (event.events & EPOLLIN)
			{
				sockets.emplace_back(Socket(event.data.fd) );
			}
			else if (event.events & EPOLLRDHUP)
			{
				disconnected.emplace_back(Socket(event.data.fd) );
			}
		}

		return false == sockets.empty() || false == disconnected.empty();
	#else
		#error "Undefine platform"
	#endif
	}
Пример #3
0
	bool SocketList::recv(std::vector<Socket> &sockets, std::vector<Socket> &disconnected) const
	{
		if (false == is_created() )
		{
			return false;
		}

	#ifdef WIN32
		size_t count = ::WSAPoll(this->poll_events.data(), this->poll_events.size(), ~0);

		if (SOCKET_ERROR == count)
		{
			return false;
		}

		for (size_t i = 0; i < this->poll_events.size(); ++i)
		{
			WSAPOLLFD &event = this->poll_events[i];

			if (event.revents & POLLHUP)
			{
				disconnected.emplace_back(Socket(event.fd) );
			}
			else if (event.revents & POLLRDNORM)
			{
				sockets.emplace_back(Socket(event.fd) );
			}
		}

		return false == sockets.empty();
	#elif POSIX
		size_t count = ::epoll_wait(this->obj_list, this->epoll_events.data(), this->epoll_events.size(), ~0);

		if (std::numeric_limits<size_t>::max() == count)
		{
			return false;
		}

		for (size_t i = 0; i < count; ++i)
		{
			epoll_event &event = this->epoll_events[i];

			if (event.events & EPOLLRDHUP)
			{
				disconnected.emplace_back(Socket(event.data.fd) );
			}
			else if (event.events & EPOLLIN)
			{
				sockets.emplace_back(Socket(event.data.fd) );
			}
		}

		return false == sockets.empty();
	#else
		#error "Undefine platform"
	#endif
	}
Пример #4
0
	void SocketList::destroy()
	{
		if (is_created() )
		{
		#ifdef WIN32
			this->obj_list = INVALID_HANDLE_VALUE;
			this->poll_events.clear();
		#elif POSIX
			::close(this->obj_list);
			this->obj_list = ~0;
			this->epoll_events.clear();
		#else
			#error "Undefine platform"
		#endif
		}
	}
Пример #5
0
	bool SocketList::addSocket(const Socket &sock)
	{
		if (false == is_created() )
		{
			return false;
		}

	#ifdef WIN32
		WSAPOLLFD event = {
			sock.get_handle(),
			POLLRDNORM,
			0
		};

		poll_events.emplace_back(event);

		return true;
	#elif POSIX
		struct ::epoll_event event = {
			EPOLLIN | EPOLLET | EPOLLRDHUP,
			reinterpret_cast<void *>(sock.get_handle() )
		};

		const int result = ::epoll_ctl(this->obj_list, EPOLL_CTL_ADD, sock.get_handle(), &event);

		if (result == ~0)
		{
			return false;
		}

		this->epoll_events.emplace_back();

		return true;
	#else
		#error "Undefine platform"
	#endif
	}
Пример #6
0
	bool SocketList::accept(std::vector<Socket> &sockets, std::vector<struct sockaddr_in> &socketsAddress) const
	{
		if (is_created() )
		{
		#ifdef WIN32
			const int count = ::WSAPoll(this->poll_events.data(), static_cast<::ULONG>(this->poll_events.size() ), ~0);

			if (SOCKET_ERROR == count)
			{
				return false;
			}

			for (size_t i = 0; i < this->poll_events.size(); ++i)
			{
				const WSAPOLLFD &event = this->poll_events[i];

				if (event.revents & POLLRDNORM)
				{
					System::native_socket_type client_socket = ~0;

					do
					{
						struct ::sockaddr_in client_addr = {};
						socklen_t client_addr_len = sizeof(client_addr);

						client_socket = ::accept(event.fd, reinterpret_cast<struct ::sockaddr *>(&client_addr), &client_addr_len);

						if (~0 != client_socket)
						{
							sockets.emplace_back(Socket(client_socket) );
							socketsAddress.emplace_back(client_addr);
						}
					}
					while (~0 != client_socket);
				}
			}

			return false == sockets.empty();
		#elif POSIX
			const int count = ::epoll_wait(this->obj_list, this->epoll_events.data(), this->epoll_events.size(), ~0);

			if (count == ~0)
			{
				return false;
			}

			for (int i = 0; i < count; ++i)
			{
				const epoll_event &event = this->epoll_events[i];

				if (event.events & EPOLLIN)
				{
					System::native_socket_type client_socket = ~0;

					do
					{
						struct ::sockaddr_in client_addr = {};
						socklen_t client_addr_len = sizeof(client_addr);

						client_socket = ::accept(event.data.fd, reinterpret_cast<struct ::sockaddr *>(&client_addr), &client_addr_len);

						if (~0 != client_socket)
						{
							sockets.emplace_back(Socket(client_socket) );
							socketsAddress.emplace_back(client_addr);
						}
					}
					while (~0 != client_socket);
				}
			}

			return false == sockets.empty();
		#else
			#error "Undefine platform"
		#endif
		}

		return false;
	}
Пример #7
0
	bool SocketList::accept(std::vector<Socket> &sockets) const
	{
		if (is_created() )
		{
		#ifdef WIN32
			size_t count = ::WSAPoll(this->poll_events.data(), this->poll_events.size(), ~0);

			if (SOCKET_ERROR == count)
			{
				return false;
			}

			for (size_t i = 0; i < this->poll_events.size(); ++i)
			{
				WSAPOLLFD &event = this->poll_events[i];

				if (event.revents & POLLRDNORM)
				{
					System::native_socket_type client_socket = ~0;

					do
					{
						client_socket = ::accept(event.fd, static_cast<sockaddr *>(nullptr), static_cast<int *>(nullptr) );

						if (~0 != client_socket)
						{
							sockets.emplace_back(Socket(client_socket) );
						}
					}
					while (~0 != client_socket);
				}
			}

			return false == sockets.empty();
		#elif POSIX
			size_t count = ::epoll_wait(this->obj_list, this->epoll_events.data(), this->epoll_events.size(), ~0);

            if (std::numeric_limits<size_t>::max() == count)
			{
				return false;
			}

			for (size_t i = 0; i < count; ++i)
			{
				epoll_event &event = this->epoll_events[i];

				if (event.events & EPOLLIN)
				{
					System::native_socket_type client_socket = ~0;

					do
					{
						client_socket = ::accept(event.data.fd, static_cast<sockaddr *>(nullptr), static_cast<socklen_t *>(nullptr) );

						if (~0 != client_socket)
						{
							sockets.emplace_back(Socket(client_socket) );
						}
					}
					while (~0 != client_socket);
				}
			}

			return false == sockets.empty();
		#else
			#error "Undefine platform"
		#endif
		}

		return false;
	}