Exemple #1
0
int main(int argc, char* argv[])
{
	WSADATA  Ws;
	if ( WSAStartup(MAKEWORD(2,2), &Ws) != 0 )
	{
		cout<<"Init Windows Socket Failed::"<<GetLastError()<<endl;
		return -1;
	} 

	CSocket mysocket;
	if ( false == mysocket.init() )
	{
		cout<<"Create Socket Failed!"<<endl;
		return -1;
	}
	if ( false == mysocket.connect(AF_INET, IP_ADDRESS, PORT) )
	{
		cout<<"Connect Failed!"<<endl;
		return -1;
	}
	else
	{
		cout<<"Connect Success!"<<endl;
	}
	//SOCKET clientSocket = mysocket.accept_connect();

	ThreadPool threadPool(1);
	threadPool.Call(&DoJob);

	fd_set fdread;
	int ret;

	while(true)
	{
// 		FD_ZERO(&fdread);
// 		FD_SET(mysocket.get_sock(), &fdread);
// 		if (SOCKET_ERROR == (ret = select(0, &fdread, NULL, NULL, NULL)))
// 		{
// 			continue;
// 		}
// 
// 		if (ret > 0)
// 		{
// 			if (FD_ISSET(mysocket.get_sock(), &fdread))
// 			{
// 				
// 			}
// 		}
	}


	WSACleanup();
	return 0;
}
void ListServer_Connect()
{
	if ((lsConnected = listServer.connect(findKey("listip"), atoi(findKey("listport")))) == false)
	{
		errorOut("rclog.txt", "Unable to connect to list server", true);
		return;
	}

	errorOut("rclog.txt", "Connected to the list server successfully\n", true);
	listServer.setSync(false);

	// send gserver info to listserver
	ListServer_Send(CPacket() << (char)SLSNAME << listServerFields[0]  << "\n" << (char)SLSDESC << listServerFields[1]  << "\n" << (char)SLSLANG << listServerFields[2]  << "\n" << (char)SLSVER  << listServerFields[3]  << "\n" << (char)SLSURL  << listServerFields[4]  << "\n" << (char)SLSIP   << listServerFields[5]  << "\n" << (char)SLSPORT << toString(serverPort) << "\n");

	// send players to listserver
	CPacket pPacket;
	for (int i = 0; i < playerList.count(); i++)
	{
		CPlayer *player = (CPlayer *)playerList[i];
		pPacket << (char)player->accountName.length() << player->accountName << player->getProp(NICKNAME) << player->getProp(CURLEVEL) << player->getProp(PLAYERX) << player->getProp(PLAYERY) << player->getProp(PALIGNMENT) << (char)player->type;
	}

	ListServer_Send(CPacket() << (char)SLSCOUNT << (char)playerList.count() << pPacket << "\n");
}
Exemple #3
0
int main(int argc, char *argv[])
{
	#ifdef PSPSDK
		pspDebugScreenInit();
		SetupCallbacks();
	#else
		// Shut down the server if we get a kill signal.
		signal( SIGINT, (sighandler_t) shutdownServer );
		signal( SIGTERM, (sighandler_t) shutdownServer );
	#endif

	/* Setup Data-Directory */
	dataDir = CBuffer(argv[0]).replaceAll("\\", "/");
	dataDir = dataDir.copy(0, dataDir.findl('/') + 1);
	programDir = dataDir;
	dataDir << "world/";

	/* Main Initiating */
	adminNames.load( __admin, sizeof(__admin) / sizeof(const char*) );
	colourNames.load( __colours, sizeof(__colours) / sizeof(const char*) );
	clothCommands.load( __cloths, sizeof(__cloths) / sizeof(const char*) );
	defaultFiles.load( __defaultfiles, sizeof(__defaultfiles) / sizeof(const char*) );
	playerIds.add(0);
	playerIds.add(0);
	npcIds.add(0);
	srand((int)time(NULL));

	/* Load Important Files */
	updateFile("rchelp.txt");
	updateFile("rcmessage.txt");
	updateFile("rules.txt");
	updateFile("serverflags.txt");
	updateFile("servermessage.html");
	updateFile("foldersconfig.txt");

	/* Load Settings */
	if (!loadSettings("serveroptions.txt"))
	{
		errorOut("errorlog.txt", "Unable to load server settings..");
		return 1;
	}

	/* Load Weapons */
	if (!loadWeapons("weapons.txt"))
	{
		errorOut("errorlog.txt", "Unable to load weapons from weapons.txt..");
		return 1;
	}

	/* Initialize Sockets */
	serverSock.setType( SOCKET_TYPE_SERVER );
	serverSock.setProtocol( SOCKET_PROTOCOL_TCP );
	serverSock.setOptions( SOCKET_OPTION_NONBLOCKING );
	serverSock.setDescription( "serverSock" );
	CString empty;
	if ( serverSock.init( empty, serverPort ) )
		return 1;

	// Connect server socket.
	if ( serverSock.connect() )
	{
		errorOut("errorlog.txt", CString() << "SOCK ERROR: Unable to listen on port: " << serverPort);
		return 1;
	}

	/* Server Finished Loading */
	printf("GServer 2 by 39ster\nSpecial thanks to Marlon, Agret, Pac300, 39ster and others for porting the \noriginal 1.39 gserver to 2.1\nServer listening on port: %s\nServer version: Build %s\n\n", serverPort.text(), listServerFields[3].text());
	errorOut("serverlog.txt", "Server started");

	if ( listServerFields[5] == "localhost" )
		errorOut("serverlog.txt", "[DEBUG_LOCALHOSTMODE] Localhost mode is activated.\nListserver communication & account authentication are disabled.", true);

	serverRunning = true;

	if ( !(listServerFields[5] == "localhost") )
		if (!lsConnected)
			ListServer_Connect();

	while (serverRunning)
	{
		long long second = time(NULL);

		while (second == time(NULL))
		{
			acceptNewPlayers(serverSock);
			for (int i = 0; i < newPlayers.count(); i ++)
			{
				CPlayer* player = (CPlayer*)newPlayers[i];
				player->main();
				if (player->deleteMe)
				{
					delete player;
					i--;
				}
			}

			for(int i = 0; i < playerList.count(); i++)
			{
				CPlayer* player = (CPlayer*)playerList[i];
				player->main();
				if(player->deleteMe)
				{
					delete player;
					i--;
				}
			}

			// Was moved so it can process faster. - Joey
			ListServer_Main();
			wait(10);
		}

		doTimer();
		gameTime ++;
		NOLEVEL->reset();

		// Every 30 seconds
		if (gameTime % 30 == 0)
		{
			ListServer_Send(CPacket() << (char)SLSPING << "\n");
		}

		// Every 10 seconds
		if (gameTime % 10 == 0)
		{
			CPacket pPacket;
			CString file;

			for (int i = 0; i < playerList.count(); i++)
			{
				CPlayer *player = (CPlayer *)playerList[i];
				file << player->accountName << "," << player->nickName << "," << player->levelName << "," << toString(player->x) << "," << toString(player->y) << "," << toString(player->ap) << "\n";
			}

			file.save("logs/playerlist.txt");
			serverFlags.save("serverflags.txt");
		}

		//Every 5 seconds?
		int current = getNWTime();
		if (nwTime != current)
		{
			nwTime = current;
			for (int i = 0; i < playerList.count(); i++)
			{
				CPacket out;
				out << (char)NEWWORLDTIME;
				out.writeByte4(current);
				((CPlayer*)playerList[i])->sendPacket(out);
			}
		}
	}
}
void ListServer_Connect()
{
	if ( serverRunning == false ) return;
	if ( setSock == false )
	{
		setSock = true;
		listServer.setDescription( "listserver" );
		listServer.setProtocol( SOCKET_PROTOCOL_TCP );
		listServer.setType( SOCKET_TYPE_CLIENT );
		listServer.setOptions( SOCKET_OPTION_NONBLOCKING );
	}
	CString ip(findKey("listip")), port(findKey("listport"));
	listServer.init( ip, port );
	int val = listServer.connect();
	if (val == 0 || val == SOCKET_ALREADY_CONNECTED) lsConnected = true;
	else lsConnected = false;
	if ( !lsConnected )
	{
		errorOut("errorlog.txt", CBuffer() << "Unable to connect to list server.", true);
		listServer.disconnect();
		return;
	}

	errorOut("serverlog.txt", CBuffer() << "Connected to the list server successfully.", true);

	// Send the ServerHQ password.
	CPacket pack;
	pack << (char)SLSSERVERHQPASS << serverhq_pass << "\n";

	// assemble server packet.
	pack << (char)SLSNEWSERVER << (char)listServerFields[0].length() << listServerFields[0];
	pack << (char)listServerFields[1].length() << listServerFields[1];
	pack << (char)listServerFields[2].length() << listServerFields[2];
	pack << (char)listServerFields[3].length() << listServerFields[3];
	pack << (char)listServerFields[4].length() << listServerFields[4];
	pack << (char)listServerFields[5].length() << listServerFields[5];
	pack << (char)serverPort.length() << serverPort;
	if (localip == CString("AUTO"))
	{
		CString slocalip(listServer.getLocalIp());
		if (slocalip == CString("127.0.1.1") || slocalip == CString("127.0.0.1"))
		{
			errorOut("serverlog.txt", CBuffer() << "[WARNING] Socket returned " << slocalip << " for its local ip!  Not sending local ip to serverlist.", true);
			pack << (char)0;
		}
		else pack << (char)slocalip.length() << slocalip;
	}
	else pack << (char)localip.length() << localip;
	pack << "\n";

	// Send the ServerHQ level.
	pack << (char)SLSSERVERHQLEVEL << (char)serverhq_level << "\n";

	// send gserver info to listserver
	ListServer_Send(pack);

	// send players to listserver
	CPacket pPacket;
	for (int i = 0; i < playerList.count(); i++)
	{
		CPlayer *player = (CPlayer *)playerList[i];
		pPacket << (char)player->accountName.length() << player->accountName << player->getProp(NICKNAME) << player->getProp(CURLEVEL) << player->getProp(PLAYERX) << player->getProp(PLAYERY) << player->getProp(PALIGNMENT) << (char)(1 << player->type);
	}

	ListServer_Send(CPacket() << (char)SLSCOUNT << (char)playerList.count() << pPacket << "\n");
}