示例#1
0
	int UDPSocketImpl::read(void *data, int size, SocketName &endpoint)
	{
		sockaddr_in addr;
		int addr_len = sizeof(sockaddr_in);

		int result = recvfrom(handle, static_cast<char*>(data), size, 0, (sockaddr *)&addr, &addr_len);
		if (result == SOCKET_ERROR)
		{
			int last_error = WSAGetLastError();
			// To do: maybe return different return values for sending errors
			if (last_error == WSAEWOULDBLOCK || last_error == WSAEMSGSIZE || last_error == WSAECONNRESET || last_error == WSAENETRESET)
			{
				endpoint = SocketName();
				return -1;
			}
			else
			{
				throw Exception("Error reading from udp socket");
			}
		}

		endpoint = SocketName();
		endpoint.from_sockaddr(AF_INET, (sockaddr *)&addr, addr_len);
		return result;
	}
示例#2
0
void NetGameServer::start(const std::string &address, const std::string &port)
{
	stop();
	impl->stop_event.reset();
	impl->tcp_listen.reset(new TCPListen(SocketName(address, port)));
	impl->listen_thread.start(this, &NetGameServer::listen_thread_main);
}
示例#3
0
	void NetGameServer::start(const std::string &address, const std::string &port)
	{
		stop();
		std::unique_lock<std::mutex> lock(impl->mutex);
		impl->stop_flag = false;
		lock.unlock();
		impl->tcp_listen.reset(new TCPListen(SocketName(address, port)));
		impl->listen_thread = std::thread(&NetGameServer::listen_thread_main, this);
	}
示例#4
0
	TCPConnection TCPListen::accept(SocketName &out_end_point)
	{
		sockaddr_in peer_address = { 0 };
		int peer_address_length = sizeof(sockaddr_in);

		SOCKET result = ::accept(impl->handle, reinterpret_cast<sockaddr*>(&peer_address), &peer_address_length);
		if (result == INVALID_SOCKET)
		{
			if (WSAGetLastError() == WSAEWOULDBLOCK)
				return TCPConnection();
			else
				throw Exception("Error accepting from socket");
		}

		out_end_point = SocketName();
		out_end_point.from_sockaddr(AF_INET, reinterpret_cast<sockaddr*>(&peer_address), peer_address_length);
		return TCPConnection(std::make_shared<TCPSocket>(result));
	}
示例#5
0
	int UDPSocketImpl::read(void *data, int size, SocketName &endpoint)
	{
		sockaddr_in addr;
		socklen_t addr_len = sizeof(sockaddr_in);

		int result = recvfrom(handle, static_cast<char*>(data), size, 0, (sockaddr *)&addr, &addr_len);
		if (result == -1)
		{
			if (errno == EWOULDBLOCK || errno == EMSGSIZE || errno == ECONNRESET || errno == ENETRESET)
			{
				endpoint = SocketName();
				return -1;
			}
			else
			{
				throw Exception("Error reading from udp socket");
			}
		}

		endpoint.from_sockaddr(AF_INET, (sockaddr *)&addr, addr_len);
		return result;
	}
示例#6
0
void NetGameClient::connect(const std::string &server, const std::string &port)
{
	disconnect();
	impl->connection.reset(new NetGameConnection(this, SocketName(server, port)));
}
示例#7
0
SocketName UDPSocket_Impl::get_local_name() const
{
	return SocketName();
}