Quellcode durchsuchen

Merge branch 'master' of https://github.com/taylor001/crown

Daniele Bartolini vor 13 Jahren
Ursprung
Commit
124696aada

+ 7 - 3
BUILD.txt

@@ -1,15 +1,19 @@
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 How to build Crown:
 How to build Crown:
 
 
-1. Create a folder named "build" in this directory.
+in root directory:
+
+1. $ mkdir build
 2. $ cd build
 2. $ cd build
 3. $ cmake ..
 3. $ cmake ..
-4. make
+4. $ make terrain
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 In order to select different build configurations you have to do the following:
 In order to select different build configurations you have to do the following:
 
 
-1. Create a folder named "build" in this directory.
+in root directory:
+
+1. $ mkdir build
 2. $ cd build
 2. $ cd build
 3. $ cmake-gui ..
 3. $ cmake-gui ..
 
 

+ 8 - 0
src/CMakeLists.txt

@@ -222,6 +222,8 @@ set (LINUX_SRC
 	os/linux/LinuxOS.cpp
 	os/linux/LinuxOS.cpp
 	os/linux/LinuxTimer.cpp
 	os/linux/LinuxTimer.cpp
 	os/linux/Input.cpp
 	os/linux/Input.cpp
+	os/linux/LinuxTCPSocket.cpp
+	os/linux/LinuxUDPSocket.cpp	
 )
 )
 
 
 set (LINUX_HEADERS
 set (LINUX_HEADERS
@@ -229,6 +231,11 @@ set (LINUX_HEADERS
 	os/linux/LinuxTimer.h
 	os/linux/LinuxTimer.h
 )
 )
 
 
+set (WIN_SRC
+#	os/win/WinTCPSocket.cpp
+#	os/win/WinUDPSocket.cpp
+)
+
 set (SOURCES
 set (SOURCES
 	${SRC}
 	${SRC}
 	${INCLUDES}
 	${INCLUDES}
@@ -253,6 +260,7 @@ set (SOURCES
 	${OS_HEADERS}
 	${OS_HEADERS}
 	${LINUX_SRC}
 	${LINUX_SRC}
 	${LINUX_HEADERS}
 	${LINUX_HEADERS}
+	${WIN_SRC}
 
 
 	${GL_SRC}
 	${GL_SRC}
 	${GL_HEADERS}
 	${GL_HEADERS}

+ 4 - 4
src/core/math/Angles.h

@@ -48,12 +48,12 @@ public:
 
 
 	real					heading, pitch, bank;
 	real					heading, pitch, bank;
 
 
-							Angles();						//!< Constructor, does nothing for efficiency
-							~Angles();						//!< Destructor
-							Angles(real h, real p, real b);	//!< Construct from three values
+							Angles();							//!< Constructor, does nothing for efficiency
+							~Angles();							//!< Destructor
+							Angles(real h, real p, real b);		//!< Construct from three values
 
 
 
 
-	Str						to_str() const;					//!< Returns a Str containing the angles' components
+	Str						to_str() const;						//!< Returns a Str containing the angles' components
 	Mat3					to_mat3() const;					//!< Returns an equivalent Mat3 representation.
 	Mat3					to_mat3() const;					//!< Returns an equivalent Mat3 representation.
 	Mat4					to_mat4() const;					//!< Returns an equivalent Mat4 representation.
 	Mat4					to_mat4() const;					//!< Returns an equivalent Mat4 representation.
 	Quat					to_quat() const;					//!< Returns an equivalent Quat representation.
 	Quat					to_quat() const;					//!< Returns an equivalent Quat representation.

+ 100 - 3
src/os/OS.h

@@ -28,6 +28,7 @@ OTHER DEALINGS IN THE SOFTWARE.
 #include "Config.h"
 #include "Config.h"
 #include "Str.h"
 #include "Str.h"
 #include "List.h"
 #include "List.h"
+#include "Types.h"
 
 
 namespace crown
 namespace crown
 {
 {
@@ -42,8 +43,8 @@ namespace os
 #ifdef LINUX
 #ifdef LINUX
 const size_t	MAX_OS_PATH_LENGTH = 1024;
 const size_t	MAX_OS_PATH_LENGTH = 1024;
 const char		PATH_SEPARATOR = '/';
 const char		PATH_SEPARATOR = '/';
-
 const size_t	MAX_OS_EVENTS = 512;
 const size_t	MAX_OS_EVENTS = 512;
+
 #endif
 #endif
 
 
 #ifdef WINDOWS
 #ifdef WINDOWS
@@ -96,6 +97,7 @@ void			hide_cursor();
 void			show_cursor();
 void			show_cursor();
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
+
 enum OSEventType
 enum OSEventType
 {
 {
 	OSET_NONE				= 0,
 	OSET_NONE				= 0,
@@ -123,7 +125,102 @@ void				push_event(OSEventType type, int data_a, int data_b, int data_c, int dat
 //! Returns the event on top of the @a event_queue	
 //! Returns the event on top of the @a event_queue	
 OSEvent&			pop_event();
 OSEvent&			pop_event();
 
 
-} // namespace os
 
 
-} // namespace crown
 
 
+//-----------------------------------------------------------------------------
+//		Networking
+//-----------------------------------------------------------------------------
+
+struct IPv4Address
+{
+	uchar 	address[4];
+	ushort 	port;
+	
+	uint get_address()
+	{
+		uint addr = address[0] << 24 | address[1] << 16 | address[2] << 8 | address[3];
+		
+		return addr;
+	}
+	
+	ushort get_port()
+	{
+		return port;
+	}
+	
+	void set(uint a, ushort p)
+	{
+		address[0] = (uchar) a >> 24;
+		address[1] = (uchar) a >> 16;
+		address[2] = (uchar) a >> 8;
+		address[3] = (uchar) a;
+
+		port = p;
+	}
+};
+
+class UDPSocket
+{
+	public:
+
+					// Constructor
+					UDPSocket();
+					// Destructor
+					~UDPSocket();
+					// Open connection
+		bool 		open(ushort port);
+					 // Send data through socket
+		bool 		send(IPv4Address &receiver, const void* data, int size );
+					// Receive data through socket
+		int 		receive(IPv4Address &sender, void* data, int size);
+					// Close connection
+		void 		close();
+					// Is connection open?
+		bool 		is_open();
+
+	private:
+					// Socket descriptor
+		int 		m_socket;  
+};
+
+class TCPSocket
+{
+	public:
+
+					// Constructor
+					TCPSocket();
+					// Destructor
+					~TCPSocket();
+					// Open connection (server side)
+		bool 		open(ushort port);
+					// Connect (client side)
+		bool		connect(IPv4Address& destination);
+					// Close connection
+		int			close();
+					// Send data through socket
+		bool 		send(const void* data, int size);
+					// Receive data through socket
+		int			receive(void* data, int size);
+					// Is connection open?
+		bool 		is_open();
+					// Getter method for socket descriptor
+		int 		get_socket_id();
+					// Getter method for active socket descriptor
+		int 		get_active_socket_id();
+				  // Setter method for socket descriptor
+
+	private:
+
+		void 		set_socket_id(int socket);
+					// Setter method for ative socket descriptor
+		void 		set_active_socket_id(int socket);
+		
+					// Generated by ::socket
+		int 		m_socket;
+				  // Generated by ::accept
+		int 		m_active_socket;
+}; 
+
+} // namespace os
+
+} // namespace crown

+ 182 - 0
src/os/linux/LinuxTCPSocket.cpp

@@ -0,0 +1,182 @@
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <cassert>
+
+#include "Types.h"
+#include "OS.h"
+
+namespace crown
+{
+namespace os
+{
+
+TCPSocket::TCPSocket()
+{
+	set_socket_id(0);
+	set_active_socket_id(0);
+}
+
+TCPSocket::~TCPSocket()
+{
+	close();
+}
+
+bool TCPSocket::open(ushort port)
+{
+	int sd = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (sd <= 0)
+	{
+		os::printf("failed to open socket\n");
+		set_socket_id(0);
+		return false;
+	}
+
+	set_socket_id(sd);
+
+	// Bind socket
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = htonl(INADDR_ANY);
+	address.sin_port = htons(port);
+
+	if (bind(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+	{
+		os::printf("failed to bind socket\n");
+		close();
+		return false;
+	}
+
+	listen(sd, 5);
+	os::printf("listening on port %d\n", port);
+
+	sockaddr_in client;
+	uint client_length = sizeof(client);
+
+	int asd = accept(sd, (sockaddr*)&client, &client_length);
+	if (asd < 0)
+	{
+		os::printf("failed to accept connection\n");
+	}
+
+	set_active_socket_id(asd);
+
+	return true;  
+}
+
+bool TCPSocket::connect(IPv4Address& destination)
+{
+	int sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+	if (sd <= 0)
+	{
+		os::printf("failed to open socket\n");
+		set_socket_id(0);
+		return false;
+	}
+
+	set_socket_id(sd);
+
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr =  htonl(destination.get_address());
+	address.sin_port = htons(destination.get_port());
+
+	if (::connect(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+	{
+		os::printf("failed to connect socket\n");
+		close();
+		return false;
+	}  
+}
+
+int	TCPSocket::close()
+{
+	int asd = get_active_socket_id();
+	if (asd != 0)
+	{
+		::close(asd);
+		set_active_socket_id(0);  
+	}
+	int sd = get_socket_id();
+	if (sd != 0)
+	{
+		::close(sd);
+		set_socket_id(0);
+	}
+}
+
+bool TCPSocket::send(const void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	int sd = get_active_socket_id();
+	if (sd <= 0)
+	{
+		set_socket_id(0);
+		set_active_socket_id(0);
+		return false;
+	}
+
+	int sent_bytes = ::send(sd, (const char*)data, size, 0);
+	if (sent_bytes <= 0)
+	{
+		os::printf("Unable to send data");
+		return false;
+	}
+
+	return true;  
+}
+
+int TCPSocket::receive(void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	int sd = get_active_socket_id();
+
+	if ( sd <= 0 )
+	{
+		return false;
+	}
+
+	int received_bytes = ::recv(sd, (char*)data, size, 0);
+	if ( received_bytes <= 0 )
+	{
+		return 0;
+	}
+
+	return received_bytes;
+}
+
+bool TCPSocket::is_open()
+{
+	return m_active_socket != 0 || m_socket != 0;
+}
+
+int	TCPSocket::get_socket_id()
+{
+	return m_socket;
+}
+
+int	TCPSocket::get_active_socket_id()
+{
+	return m_active_socket;
+}
+
+void TCPSocket::set_socket_id(int socket)
+{
+	m_socket = socket;
+}
+
+void TCPSocket::set_active_socket_id(int socket)
+{
+	m_active_socket = socket;
+}
+		
+}
+}

+ 127 - 0
src/os/linux/LinuxUDPSocket.cpp

@@ -0,0 +1,127 @@
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <cassert>
+
+#include "Types.h"
+#include "OS.h"
+
+namespace crown
+{ 
+namespace os
+{
+
+UDPSocket::UDPSocket()
+{
+	m_socket = 0;  
+}
+UDPSocket::~UDPSocket()
+{
+	close();
+}
+
+bool UDPSocket::open(ushort port)
+{
+  		assert(!is_open());
+
+		m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+		if (m_socket <= 0)
+		{
+			os::printf("Failed to create socket.\n");;
+			m_socket = 0;
+			return false;
+		}
+
+		// bind to port
+		sockaddr_in address;
+		address.sin_family = AF_INET;
+		address.sin_addr.s_addr = INADDR_ANY;
+		address.sin_port = htons(port);
+
+		if ( bind( m_socket, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+		{
+			os::printf("Failed to bind socket\n");
+			close();
+			return false;
+		}
+
+		int non_blocking = 1;
+		if (fcntl( m_socket, F_SETFL, O_NONBLOCK, non_blocking ) == -1)
+		{
+			os::printf("Failed to set non-blocking socket\n");
+			close();
+			return false;
+		}
+		
+		return true;
+}
+
+bool UDPSocket::send(IPv4Address &receiver, const void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	if (m_socket == 0)
+	{
+		return false;
+	}
+	
+	assert(receiver.address);
+	assert(receiver.port);
+
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = htonl(receiver.get_address());
+	address.sin_port = htons(receiver.get_port());
+
+	int sent_bytes = sendto(m_socket, (const char*)data, size, 0, (sockaddr*)&address, sizeof(sockaddr_in));
+
+	return sent_bytes == size;
+}
+
+int UDPSocket::receive(IPv4Address &sender, void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	if (m_socket == 0)
+	{
+		return false;
+	}
+
+	sockaddr_in from;
+	socklen_t from_length = sizeof(from);
+
+	int received_bytes = recvfrom(m_socket, (char*)data, size, 0, (sockaddr*)&from, &from_length);
+
+	if (received_bytes <= 0)
+	{
+			return 0;
+	}
+
+	uint address = ntohl(from.sin_addr.s_addr);
+	ushort port = ntohs(from.sin_port);
+
+	sender.set(address, port);
+
+	return received_bytes;	
+}
+
+void UDPSocket::close()
+{
+	if ( m_socket != 0 )
+	{
+		::close(m_socket);
+		m_socket = 0; 
+	}
+}
+
+bool UDPSocket::is_open()
+{
+	return m_socket != 0;
+}
+
+} // namespace os
+} // namespace crown

+ 181 - 0
src/os/win/WinTCPSocket.cpp

@@ -0,0 +1,181 @@
+#include <cassert>
+#include <winsock2.h>
+#pragma comment(lib, "wsock32.lib")
+
+#include "Types.h"
+#include "OS.h"
+
+namespace crown
+{
+namespace os
+{
+ 
+TCPSocket::TCPSocket()
+{
+	set_socket_id(0);
+	set_active_socket_id(0);  
+}
+
+TCPSocket::~TCPSocket()
+{
+	close();
+}
+
+bool TCPSocket::open(unsigned short port)
+{
+	int sd = socket(AF_INET, SOCK_STREAM, 0);
+
+	if (sd <= 0)
+	{
+		os::printf("failed to open socket\n");
+		set_socket_id(0);
+		return false;
+	}
+
+	set_socket_id(sd);
+
+	// Bind socket
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = htonl(INADDR_ANY);
+	address.sin_port = htons(port);
+
+	if (bind(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+	{
+		os::printf("failed to bind socket\n");
+		close();
+		return false;
+	}
+
+	listen(sd, 5);
+	os::printf("listening on port %d", port);
+
+	sockaddr_in client;
+	uint client_length = sizeof(client);
+
+	int active_sd = accept(sd, (sockaddr*)&client, &client_length);
+	if (active_sd < 0)
+	{
+		os::printf("failed to accept connections");
+	}
+
+	set_active_socket_id(active_sd);
+
+	return true;  
+}
+
+bool TCPSocket::connect(IPv4Address& destination)
+{		
+	int sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+
+	if (sd <= 0)
+	{
+		os::printf("failed to open socket\n");
+		set_socket_id(0);
+		return false;
+	}
+	
+	set_socket_id(sd);
+
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr =  htonl(destination.get_address());
+	address.sin_port = htons(destination.get_port());
+
+	if (::connect(sd, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+	{
+		os::printf("failed to connect socket\n");
+		close();
+		return false;
+	}
+}
+
+int	TCPSocket::close()
+{
+		int asd = get_active_socket_id();
+		if (asd != 0)
+		{
+			closesocket(asd);
+			set_active_socket_id(0);
+		}
+
+		int sd = get_socket_id();
+		if (sd != 0)
+		{
+			closesocket(sd);
+			set_socket_id(0);
+		}
+}
+
+bool TCPSocket::send(const void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	int sd = get_active_socket_id();
+	if (sd <= 0)
+	{
+		set_socket_id(0);
+		set_active_socket_id(0);
+		return false;
+	}
+
+	int sent_bytes = ::send(sd, (const char*)data, size, 0);
+	if (sent_bytes <= 0)
+	{
+		os::printf("Unable to send data");
+		return false;
+	}
+
+	return true;  
+}
+
+int	TCPSocket::receive(void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	int sd = get_active_socket_id();
+
+	if ( sd <= 0 )
+	{
+		return false;
+	}
+
+	int received_bytes = recv(sd, (char*)data, size, 0);
+	if ( received_bytes <= 0 )
+	{
+		return 0;
+	}
+
+	return received_bytes;  
+}
+
+bool TCPSocket::is_open()
+{
+	return m_active_socket != 0 || m_socket != 0;
+}
+
+int TCPSocket::get_socket_id()
+{
+	return m_socket; 
+}
+
+int	TCPSocket::get_active_socket_id()
+{
+	return m_active_socket != 0 ? m_active_socket : m_socket; 
+}
+
+void TCPSocket::set_socket_id(int socket)
+{
+	m_socket = socket;
+}
+
+void TCPSocket::set_active_socket_id(int socket)
+{
+	m_active_socket = socket;
+}
+	
+}
+}
+

+ 129 - 0
src/os/win/WinUDPSocket.cpp

@@ -0,0 +1,129 @@
+#include <cassert>
+#include <winsock2.h>
+#pragma comment(lib, "wsock32.lib")
+
+#include "Types.h"
+#include "OS.h"
+
+namespace crown
+{
+namespace os
+{
+
+UDPSocket::UDPSocket()
+{
+	m_socket = 0;
+}
+
+UDPSocket::~UDPSocket()
+{
+	close();
+}
+
+bool UDPSocket::open(ushort port)
+{
+	assert(!is_open());
+
+	m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+	if (m_socket <= 0)
+	{
+		os::printf("Failed to create socket.");
+		m_socket = 0;
+		return false;
+	}
+
+	// bind to port
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = INADDR_ANY;
+	address.sin_port = htons(port);
+
+	if ( bind( m_socket, (const sockaddr*)&address, sizeof(sockaddr_in)) < 0)
+	{
+		os::printf("Failed to bind socket");
+		close();
+		return false;
+	}
+
+	// set non-blocking io
+	DWORD non_blocking = 1;
+	if (ioctlsocket( socket, FIONBIO, &non_blocking ) != 0)
+	{
+		os::printf("Failed to set non-blocking socket");
+		close();
+		return false;
+	}
+
+	return true;  
+}
+
+bool UDPSocket::send(IPv4Address &receiver, const void* data, int size )
+{
+	assert(data);
+	assert(size > 0);
+
+	if (m_socket == 0)
+	{
+		return false;
+	}
+	
+	assert(receiver.get_address() != 0);
+	assert(receiver.get_port() != 0);
+
+	sockaddr_in address;
+	address.sin_family = AF_INET;
+	address.sin_addr.s_addr = htonl(receiver.get_address());
+	address.sin_port = htons(receiver.get_port());
+
+	int sent_bytes = sendto(m_socket, (const char*)data, size, 0, (sockaddr*)&address, sizeof(sockaddr_in));
+
+	return sent_bytes == size;  
+}
+
+int UDPSocket::receive(IPv4Address &sender, void* data, int size)
+{
+	assert(data);
+	assert(size > 0);
+
+	if (m_socket == 0)
+	{
+		return false;
+	}
+
+	typedef int socklen_t;
+
+	sockaddr_in from;
+	socklen_t from_length = sizeof(from);
+
+	int received_bytes = recvfrom(m_socket, (char*)data, size, 0, (sockaddr*)&from, &from_length);
+
+	if (received_bytes <= 0)
+	{
+			return 0;
+	}
+
+	uint address = ntohl(from.sin_addr.s_addr);
+	ushort port = ntohs(from.sin_port);
+
+	sender.set(address, port);
+
+	return received_bytes;
+}
+
+void UDPSocket::close()
+{
+	if ( m_socket != 0 )
+	{
+		closesocket(m_socket);
+		m_socket = 0;
+	}  
+}
+
+bool UDPSocket::is_open()
+{
+	return m_socket != 0; 
+}
+
+}
+}
+