Sfoglia il codice sorgente

Experimantal parts of netcode

Michał W. Urbańczyk 17 anni fa
parent
commit
9422b0d9ca

+ 0 - 1
CAdvmapInterface.cpp

@@ -262,7 +262,6 @@ void CTerrainRect::deactivate()
 }; 
 void CTerrainRect::clickLeft(tribool down)
 {
-	LOGE("Left mouse button down2");
 	if ((down==false) || indeterminate(down))
 		return;
 	if (LOCPLINT->adventureInt->selection.type != HEROI_TYPE)

+ 7 - 25
CMT.cpp

@@ -42,11 +42,10 @@
 #include "CLua.h"
 #include "CAdvmapInterface.h"
 #include "client/Graphics.h"
-#include <boost/asio.hpp>
 #include <boost/thread.hpp>
+#include "lib/Connection.h"
 std::string NAME = NAME_VER + std::string(" (client)");
 DLL_EXPORT void initDLL(CLodHandler *b);
-using boost::asio::ip::tcp;
 SDL_Surface * screen, * screen2;
 extern SDL_Surface * CSDL_Ext::std32bppSurface;
 TTF_Font * TNRB16, *TNR, *GEOR13, *GEORXX, *GEORM, *GEOR16;
@@ -61,30 +60,13 @@ void handleCPPObjS(std::map<int,CCPPObjectScript*> * mapa, CCPPObjectScript * sc
 }
 int _tmain(int argc, _TCHAR* argv[])
 { 
-	boost::thread servthr(boost::bind(system,"VCMI_server.exe"));
-	/*
-    boost::asio::io_service io_service;
-    boost::system::error_code error = boost::asio::error::host_not_found;
-	tcp::socket socket(io_service);
-    tcp::resolver resolver(io_service);
-    tcp::resolver::query query("127.0.0.1", "3030");
-    tcp::resolver::iterator endpoint_iterator = resolver.resolve(tcp::resolver::query("127.0.0.1", "3030"));
-    socket.connect(*endpoint_iterator, error);
-
-	boost::array<char, 128> buf;
-
-  size_t len = socket.read_some(boost::asio::buffer(buf), error);
-
-  if (error == boost::asio::error::eof)
-    ; // Connection closed cleanly by peer.
-  else if (error)
-    throw boost::system::system_error(error); // Some other error.
-
-  std::cout.write(buf.data(), len);
-  len = socket.read_some(boost::asio::buffer(buf), error);
-  std::cout.write(buf.data(), len);*/
-
+	//boost::thread servthr(boost::bind(system,"VCMI_server.exe")); //runs server executable; 
+												//TODO: add versions for other platforms
+	CConnection c("localhost","3030",NAME,std::cout);
+	int r;
+	c >> r;		
 
+	std::cout << NAME << std::endl;
 	srand ( time(NULL) );
 	CPG=NULL;
 	atexit(SDL_Quit);

+ 0 - 1
CPlayerInterface.cpp

@@ -1756,7 +1756,6 @@ void CPlayerInterface::handleEvent(SDL_Event *sEvent)
 
 	else if ((sEvent->type==SDL_MOUSEBUTTONDOWN) && (sEvent->button.button == SDL_BUTTON_LEFT))
 	{
-		LOGE("Left mouse button down1");
 		for(int i=0; i<lclickable.size();i++)
 		{
 			if (isItIn(&lclickable[i]->pos,sEvent->motion.x,sEvent->motion.y))

+ 1 - 1
client/VCMI_client.vcproj

@@ -17,7 +17,7 @@
 	<Configurations>
 		<Configuration
 			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			OutputDirectory="$(SolutionDir)"
 			IntermediateDirectory="$(ConfigurationName)"
 			ConfigurationType="1"
 			CharacterSet="1"

+ 3 - 14
global.h

@@ -7,9 +7,10 @@
 #include <iostream>
 #include "int3.h"
 #define THC
-#else 
-#define THC //
 #endif
+
+#define NAME_VER ("VCMI \"Altanatse\" 0.7")
+
 enum Ecolor {RED, BLUE, TAN, GREEN, ORANGE, PURPLE, TEAL, PINK}; //player's colors
 enum EterrainType {border=-1, dirt, sand, grass, snow, swamp, rough, subterranean, lava, water, rock};
 enum Eriver {noRiver=0, clearRiver, icyRiver, muddyRiver, lavaRiver};
@@ -31,18 +32,6 @@ extern CGameInfo* CGI;
 #define HEROI_TYPE (0)
 #define TOWNI_TYPE (1)
 
-//#define LOGUJ
-
-#ifdef LOGUJ
-#define LOG(x) std::cout<<x;
-#define LOGE(x) std::cout<<x<<std::endl;
-#else
-#define LOG(x) ;
-#define LOGE(x) ;
-#endif
-
-#define NAME_VER ("VCMI \"Altanatse\" 0.7")
-
 const int F_NUMBER = 9; //factions (town types) quantity
 const int PLAYER_LIMIT = 8; //player limit per map
 const int HEROES_PER_TYPE=8; //amount of heroes of each type

+ 72 - 0
lib/Connection.cpp

@@ -0,0 +1,72 @@
+#define VCMI_DLL
+#include "Connection.h"
+#include <boost/asio.hpp>
+using namespace boost;
+using namespace boost::asio::ip;
+
+#define LOG(a) \
+	if(logging)\
+		out << a
+#if defined(__hppa__) || \
+    defined(__m68k__) || defined(mc68000) || defined(_M_M68K) || \
+    (defined(__MIPS__) && defined(__MISPEB__)) || \
+    defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC) || \
+    defined(__sparc__)
+#define BIG_ENDIAN
+#else
+#define LIL_ENDIAN
+#endif
+
+
+CConnection::CConnection(std::string host, std::string port, std::string Name, std::ostream & Out)
+:io_service(new asio::io_service), name(Name), out(Out)
+{
+#ifdef LIL_ENDIAN
+	myEndianess = true;
+#else
+	myEndianess = false;
+#endif
+    system::error_code error = asio::error::host_not_found;
+	socket = new tcp::socket(*io_service);
+    tcp::resolver resolver(*io_service);
+    tcp::resolver::iterator endpoint_iterator = resolver.resolve(tcp::resolver::query(host,port));
+    socket->connect(*endpoint_iterator, error);
+	if(error)
+	{ 
+		connected = false;
+		return;
+	}
+	std::string pom;
+	//we got connection
+	(*this) << std::string("Aiya!\n") << name << myEndianess; //identify ourselves
+	(*this) >> pom >> pom >> contactEndianess;
+}
+CConnection::CConnection(
+			boost::asio::basic_stream_socket<boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp>  > * Socket, 
+			boost::asio::io_service *Io_service, 
+			std::string Name, 
+			std::ostream & Out	)
+:socket(Socket),io_service(Io_service), out(Out), name(Name)
+{
+	std::string pom;
+	//we start with just connected socket
+	(*this) << std::string("Aiya!\n") << name << myEndianess; //identify ourselves
+	(*this) >> pom >> pom >> contactEndianess;
+}
+int CConnection::write(const void * data, unsigned size)
+{
+	LOG("wysylam dane o rozmiarze " << size << std::endl);
+	int ret;
+	ret = asio::write(*socket,asio::const_buffers_1(asio::const_buffer(data,size)));
+	return ret;
+}
+int CConnection::read(void * data, unsigned size)
+{
+	int ret = asio::read(*socket,asio::mutable_buffers_1(asio::mutable_buffer(data,size)));
+	return ret;
+}
+CConnection::~CConnection(void)
+{
+	delete io_service;
+	delete socket;
+}

+ 84 - 0
lib/Connection.h

@@ -0,0 +1,84 @@
+#pragma once
+#include "../global.h"
+#include <boost/cstdint.hpp>
+#include <string>
+namespace boost
+{
+	namespace asio
+	{
+		namespace ip
+		{
+			class tcp;
+		}
+		class io_service;
+
+		template <typename Protocol> class stream_socket_service;
+		template <typename Protocol,
+			typename StreamSocketService>
+		class basic_stream_socket;
+	}
+};
+
+class DLL_EXPORT CConnection
+{
+	std::ostream &out;
+	CConnection(void);
+public:
+	boost::asio::basic_stream_socket < boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp>  > * socket;
+	bool logging;
+	bool connected;
+	bool myEndianess, contactEndianess; //true if little endian, if ednianess is different we'll have to revert recieved multi-byte vars
+    boost::asio::io_service *io_service;
+	std::string name; //who uses this connection
+
+	CConnection(std::string host, std::string port, std::string Name, std::ostream & Out);
+	CConnection(boost::asio::basic_stream_socket < boost::asio::ip::tcp , boost::asio::stream_socket_service<boost::asio::ip::tcp>  > * Socket, boost::asio::io_service *Io_service, std::string Name, std::ostream & Out); //use immediately after accepting connection into socket
+	int write(const void * data, unsigned size);
+	int read(void * data, unsigned size);
+	int readLine(void * data, unsigned maxSize);
+	~CConnection(void);
+};
+
+
+template <typename T> CConnection & operator<<(CConnection &c, const T &data);
+template <typename T> CConnection & operator>>(CConnection &c, T &data);
+CConnection & operator<<(CConnection &c, const std::string &data)
+{
+	boost::uint32_t length = data.size();
+	c << length;
+	c.write(data.c_str(),length);
+	return c;
+}
+CConnection & operator>>(CConnection &c, std::string &data)
+{
+	boost::uint32_t length;
+	c >> length;
+	data.reserve(length);
+	c.read((void*)data.c_str(),length);
+	return c;
+}
+CConnection & operator<<(CConnection &c, const char * &data)
+{
+	boost::uint32_t length = strlen(data);
+	c << length;
+	c.write(data,length);
+	return c;
+}
+CConnection & operator>>(CConnection &c, char * &data)
+{
+	boost::uint32_t length;
+	c >> length;
+	data = new char[length];
+	c.read(data,length);
+	return c;
+}
+template <typename T> CConnection & operator<<(CConnection &c, const T &data)
+{
+	c.write(&data,sizeof(data));
+	return c;
+}
+template <typename T> CConnection & operator>>(CConnection &c, T &data)
+{
+	c.read(&data,sizeof(data));
+	return c;
+}

+ 9 - 1
lib/VCMI_lib.vcproj

@@ -17,7 +17,7 @@
 	<Configurations>
 		<Configuration
 			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
+			OutputDirectory="$(SolutionDir)"
 			IntermediateDirectory="$(ConfigurationName)"
 			ConfigurationType="2"
 			CharacterSet="2"
@@ -363,6 +363,10 @@
 				RelativePath="..\hch\CObjectHandler.cpp"
 				>
 			</File>
+			<File
+				RelativePath=".\Connection.cpp"
+				>
+			</File>
 			<File
 				RelativePath="..\hch\CTownHandler.cpp"
 				>
@@ -421,6 +425,10 @@
 				RelativePath="..\hch\CObjectHandler.h"
 				>
 			</File>
+			<File
+				RelativePath=".\Connection.h"
+				>
+			</File>
 			<File
 				RelativePath="..\hch\CTownHandler.h"
 				>

+ 4 - 0
server/VCMI_server.vcproj

@@ -57,6 +57,8 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
+				AdditionalDependencies="VCMI_lib.lib"
+				AdditionalLibraryDirectories="G:\vcmt\repa\libs"
 				GenerateDebugInformation="true"
 				TargetMachine="1"
 			/>
@@ -125,6 +127,8 @@
 			/>
 			<Tool
 				Name="VCLinkerTool"
+				AdditionalDependencies="VCMI_lib.lib"
+				AdditionalLibraryDirectories="G:\vcmt\repa\libs"
 				GenerateDebugInformation="true"
 				OptimizeReferences="2"
 				EnableCOMDATFolding="2"

+ 16 - 29
server/server_main.cpp

@@ -3,27 +3,12 @@
 #include <boost/bind.hpp>
 #include <boost/asio.hpp>
 #include "../global.h"
+#include "../lib/Connection.h"
 std::string NAME = NAME_VER + std::string(" (server)");
 using boost::asio::ip::tcp;
 using namespace boost;
 using namespace boost::asio;
-
-class CConnection
-{
-public:
-	int ID;
-	tcp::socket socket;
-	void witaj()
-	{
-		char message[50]; strcpy(message,NAME.c_str());message[NAME.size()]='\n';
-		write(socket,buffer("Aiya!\n"));
-		write(socket,buffer(message,NAME.size()+1));
-	}
-	CConnection(io_service& io_service, int id=-1)
-		: socket(io_service), ID(id)
-	{
-	}
-};
+using namespace boost::asio::ip;
 
 class CVCMIServer
 {
@@ -38,27 +23,29 @@ public:
 private:
 	void start_accept()
 	{
+		boost::system::error_code error;
 		std::cout<<"Listening for connections at port " << acceptor.local_endpoint().port() << std::endl;
-		CConnection * new_connection = new CConnection(acceptor.io_service());
-		acceptor.accept(new_connection->socket);
-		new_connection->witaj();
-		acceptor.async_accept(new_connection->socket,
-			boost::bind(&CVCMIServer::gotConnection, this, new_connection,
-			placeholders::error));
-	}
-
-	void gotConnection(CConnection * connection,const boost::system::error_code& error)
-	{
+		tcp::socket s(acceptor.io_service());
+		acceptor.accept(s,error);
 		if (!error)
 		{
+			CConnection *connection = new CConnection(&s,&s.io_service(),NAME,std::cout);
 			std::cout<<"Got connection!" << std::endl;
-			connection->witaj();
-			start_accept();
 		}
 		else
 		{
 			std::cout<<"Got connection but there is an error " << std::endl;
 		}
+
+		//asio::write(s,asio::buffer("570"));
+		//new_connection->witaj();
+		//acceptor.async_accept(s,
+		//	boost::bind(&CVCMIServer::gotConnection, this, &s,
+		//	placeholders::error));
+	}
+
+	void gotConnection(tcp::socket *s,const boost::system::error_code& error)
+	{
 	}
 
 };