游戏服务器端通信框架(C++与Socket)

本文介绍了一个小型的多人对战游戏服务器端的实现,使用C++编程语言和Socket进行网络通信。主要涉及七个核心文件:stdafx.h, stdafx.cpp, DSObject.h, DSObject.cpp, DSGameServer.h, DSGameServer.cpp 和 DSMain.cpp。在VC++6.0环境中编译时,需要链接ws2_32.lib库。" 98661707,8743882,机器学习中缺失值处理:对比分析与策略,"['机器学习', '数据预处理', '数据挖掘', '缺失值处理']
摘要由CSDN通过智能技术生成

  这是一个小型多个对战的游戏服务器端代码,经过修改。

文件一:stdafx.h

//-------------------------------------------------------------------------
//stdafx.h中的函数为全局共享
//
//版权所有 DreamShip
//
//-------------------------------------------------------------------------

#ifndef _STDAFX_
#define _STDAFX_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#include <winsock2.h>
#include<time.h>

#include "DSGameServer.h"

#include "DSObject.h"


//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
float DS_ReturnFloat(char *ds_Dest,char ds_Search) ;
int   DS_ReturnInt(char *ds_Dest,char ds_Search) ;
int   DS_ReturnString(char *ds_Dest,char ds_Search,char *buf ) ;
int   DS_ReturnCharPosition( char *ds_Dest,char ds_Search );
//检测当前耗时
void DS_PrintTime( long time );
void DS_GetCurrentTime( char timeBuf[] );
void DS_PrintCurrentTime( char *ds_Msg );

#endif

文件二:stdafx.cpp

//----------------------------------------------------------------------------------
//stdafx.cpp用于全局函数的定义
// 
//
//----------------------------------------------------------------------------------

#include "stdafx.h"

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
float DS_ReturnFloat(char *ds_Dest,char ds_Search)
{
	long time = timeGetTime();
	int i=0;
    
	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            char buf[50]; 
			while( ds_Dest[i] != '*' )
			{
		    	if( ds_Dest[i] =='\0' )
					return -100.0f ;
				buf[j]=ds_Dest[i] ;
				i++ ;
			    j++ ;
			}
			buf[j]='\0';
		
	       	if( buf[0] >= '0' && buf[0] <= '9' )
				return (float)atof(buf);
			else
				return -10000.0f;
		
		}

		i++ ;
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -10000.0f ;
}

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
int DS_ReturnInt(char *ds_Dest,char ds_Search)
{
	long time = timeGetTime();
	int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            char buf[50]; 
			while( ds_Dest[i] != '*' )
			{
			
				if( ds_Dest[i] =='\0' )
					return -100 ;

				buf[j]=ds_Dest[i] ;
				i++ ;
				j++ ;
				
			}
			buf[j]='\0';
		
			if( buf[0] >= '0' && buf[0] <= '9' )
			    return atoi(buf);
			else
				return -10000;
		}

		i++ ;
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -10000;
}

//-------------------------------------------------------------------
// 字符解码调用函数
// 在一串字符中寻找ds_Search中后的数据
// 有浮点型 整形 字符型 
//  
//
//------------------------------------------------------------------
int DS_ReturnString(char *ds_Dest,char ds_Search,char *buf )
{
	long time = timeGetTime();
    int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		{
			
			int j = 0;
			i++;
            
			while( ds_Dest[i] != '*' )
			{
			
				if( ds_Dest[i] =='\0' )
					return -1 ;
				buf[j]=ds_Dest[i] ;
				i++ ;
				j++ ;
				
			}
			buf[j]='\0';
			return 1;
		}

		i++ ;
		
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return 0;
}
//---------------------------------------------------------------------------
//用于获取当前字符的位置
//
//
//----------------------------------------------------------------------------
int DS_ReturnCharPosition(char *ds_Dest,char ds_Search)
{
    long time = timeGetTime();
    int i=0;

	while( ds_Dest[i] != '\0' )
	{
		
		if( ds_Dest[i] == ds_Search )
		   return i ;
		i++ ;
		
	}
	printf("查找不成功所需时间:%d\n",timeGetTime()-time);
	return -1;
}
//---------------------------------------------------------------------------
//用于测试当前耗时
//
//
//----------------------------------------------------------------------------
void DS_PrintTime( long time )
{
  printf( " 程序耗时:%d \n " , timeGetTime()-time );
}
//-------------------------------------------------
//获得当前时间
//
//
//------------------------------------------------------
void DS_GetCurrentTime(char timeBuf[])
{
    struct tm *p;
	long ltime;
	time(&ltime);
	p=localtime(&ltime);
	strftime(timeBuf,25,"%a %d %b %Y %H:%M:%S",p);
}
//---------------------------------------------------
//打印当前时间
//
//
//------------------------------------------
void DS_PrintCurrentTime( char *ds_Msg )
{
	char buf[29];
	struct tm *p;
	long ltime;
//	_strtime(buf);
//	printf("当前时间为:\t\t\t\t%s\n", buf);
//	_strdate(buf);
//	printf("当前日期为:\t\t\t\t%s\n", buf); 
	time(&ltime);
	p=localtime(&ltime);
	strftime(buf,29,"%a %d %b %Y %H:%M:%S GMT",p);
	printf("%s时间:%s\n",ds_Msg,buf);

}


文件三:DSObject.h

//-------------------------------------------------------------
//DSObject.h
// 用于对系统的调度
//
//---------------------------------------------------------------

#ifndef _DSOBJECT_
#define _DSOBJECT_

//DSENEMY 指当前为敌人 DSBULLET 指当前类型为子弹
//DSPLAYER 指当前类型为自已 DSHEAD 指当前类型为头结点 
enum OBJECT_TYPE { DSENEMY,DSBULLET,DSPLAYER,DSHEAD,DSNULL};
enum NETOBJECT_TYPE{ DSRED,DSBLUE,DSNETOTHERS,DSNETHEAD,DSNETNULL};

struct D3DXVECTOR3 
{
	float x ;
	float y ;
	float z ;
};

class DSObject
{
public :
	DSObject( OBJECT_TYPE ds_Type );
	DSObject();

	~DSObject();

   virtual HRESULT  DS_InitObject();//用于对象的初始化
   virtual void     DS_FrameMove( );//用于计算 
   virtual void     DS_RenderScene();//用于渲染
   virtual void     DS_CleanUp();//清空处理

   //用于网络对象的帧刷新
   virtual HRESULT  DS_NetFrameMove();
   //用于该对象的显示
   virtual void   DS_NetRenderScene();
   
   
public:
	DSObject        *ds_Previous; //前驱结点
	DSObject        *ds_Next;   //后继寻点

	OBJECT_TYPE     ds_Type;  //对象的类型
	bool            ds_Active;//是否处于存活状态
	int             ds_Health;//目前的生命值
	
	int             ds_ID ;//对象的ID号
	NETOBJECT_TYPE  ds_NetType ;//其网络类型
    char            ds_Username[20]; //客户机姓名

	float           ds_Radius;//碰撞半径
	D3DXVECTOR3     ds_CurrentPos;//当前位置 
	int             ds_Score ;//记录当前的战绩
};

#endif


文件四:DSObject.cpp

//-------------------------------------------------------------
//DSObject.cpp
// 用于对系统的调度
// 是DSEnemy DSPlayer DSBullet 的父类
//--------------------------------
C++是一种强大的编程语言,尤其适合用于游戏服务器端开发。学习C++游戏服务器端主要包括以下几个步骤: 1. **基础语法**:首先,你需要掌握C++的基本语法,包括变量、数据类型、运算符、控制结构等。熟悉C++标准库,如iostream用于输入输出。 2. **网络编程**:了解TCP/IP协议,学习如何使用socket API进行网络连接和通信,比如使用Boost.Asio或Winsock库。 3. **并发编程**:游戏服务器通常需要处理大量并发连接,因此学习线程、进程管理和同步机制(如互斥量、条件变量)至关重要。 4. **异步IO**:游戏服务器往往涉及大量的I/O操作,非阻塞或多路复用技术能提高性能。例如,使用epoll或select函数。 5. **内存管理**:C++对内存管理有很高的灵活性,但也需要小心内存泄漏和悬挂指针。学习如何使用智能指针和STL容器可以避免这些问题。 6. **数据库交互**:如果你的游戏需要存储数据,学会使用SQL查询或者其他NoSQL数据库系统会很有帮助。 7. **服务器架构设计**:理解负载均衡、集群、心跳检测和故障恢复等服务器架构知识。 8. **安全与稳定性**:考虑防火墙规则、加密通信、错误处理以及日志记录,确保服务器的安全稳定。 9. **框架与库**:研究现成的游戏服务器框架如RakNet、Ace或Sockets++,它们封装了常用的功能并简化了开发过程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值