⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lsnsock.h

📁 小时候玩过的在纸上画的小游戏
💻 H
字号:
#pragma once

class CMsg;
class CCntSock;

//SetDiscSign return value means this function is a void function
//and if do something base on this operation should check msg.IsDiscSignal()
typedef void SetDiscSign;
typedef bool (*RcvCallBack)(CMsg* msg);
typedef void (*AcptCallBack)(CCntSock** out);
//exception happened,need to abnormal disconnect
typedef void (*DisConnBack)(UINT info);

class CMsg
{
public:
	_state state;
	UINT PosX;
	UINT PosY;
	CString str;
public:
	void SerializeRev(CArchive& ar);
	void SerializeSnd(CArchive& ar) const;

	CMsg(){Set4None();state=stNONE;PosX=PosY=0;}

	_state GetMsgState() const;
   bool IsDiscSignal(bool IsBack = false) const;
	void Set4None();
	void Set4Pos(UINT x, UINT y,bool IsBack=false);
	void Set4Chat(const CString& _str,bool IsBack=false);
	void Set4Conn(bool IsBack=false);
	void Set4Disc(bool IsBack=false);
	void Set4Start(bool IsBack=false);
	void Set4Hit(_tag hitTag,int x,int y,bool IsBack=false);
	void Set4Lose(int x,int y,bool IsBack=false);
};

inline bool CMsg::IsDiscSignal(bool IsBack) const {	return (IsBack)?(state==stDISCBK):(state ==stDISC); }

class CCntSock: public CSocket
{
	CMsg msg;
	CSocketFile* File;
	CArchive* ArchiveIn;
	CArchive* ArchiveOut;
protected:
	virtual void OnReceive(int nErrorCode);
	CCntSock(const CCntSock& rSrc); // no implementation
	void operator=(const CCntSock& rSrc);  // no implementation
	RcvCallBack ReceiveMsgFnx;
	DisConnBack  DisConnectFnx;

public:
	void Init();
	//void Abort();
	bool SendMsg(const CMsg& msg)const ;
	SetDiscSign BeginConnect(LPCTSTR lpszAddress, UINT nPort=0);

	void Over();
	bool IsOver;

	CCntSock(RcvCallBack rcbFnx,DisConnBack dcFnx);
	~CCntSock(){Over();}
};

inline CCntSock::CCntSock(RcvCallBack rcbFnx,DisConnBack dcFnx){
		ReceiveMsgFnx = rcbFnx;
		DisConnectFnx = dcFnx;
		File=0;ArchiveIn=0;ArchiveOut=0;
		IsOver=false;
	}

// CSvrSock 命令目标

class CSvrSock : public CSocket
{
protected:
	CSvrSock(const CSvrSock& rSrc); // no implementation
	void operator=(const CSvrSock& rSrc);  // no implementation
	virtual void OnAccept(int nErrorCode);
	AcptCallBack acptFnx;
	DisConnBack  DisConnectFnx;

public:
	SetDiscSign BeginListen(UINT port=0);
	void Over(){IsOver=true;};
	bool IsOver;
	CSvrSock(AcptCallBack acbFnx,DisConnBack dcFnx);
	~CSvrSock(){Over();}
};

inline CSvrSock::CSvrSock(AcptCallBack acbFnx,DisConnBack dcFnx){
	acptFnx = acbFnx;
	DisConnectFnx= dcFnx;
	IsOver=false;
}

inline _state CMsg::GetMsgState() const{
	return state;
}

inline void CMsg::Set4None(){
	state=stNONE;
	PosX=PosY=0;
	str.Empty();
}
inline void CMsg::Set4Pos(UINT x, UINT y,bool IsBack){
	state=IsBack?stPOSBK:stPOS;
	ASSERT(x>0 && y>0);
	PosX=x;PosY=y;
	str.Empty();
}
inline void CMsg::Set4Chat(const CString& _str,bool IsBack){
	state=IsBack?stCHATBK:stCHAT;
	PosX=PosY=0;
	str=_str;
}
inline void CMsg::Set4Conn(bool IsBack){
	state=IsBack?stCONNBK:stCONN;
	PosX=1;PosY=0;//version number
	str=L"\nHELLO";
}
inline void CMsg::Set4Disc(bool IsBack){
	state=IsBack?stDISCBK:stDISC;
	PosX=PosY=0;
	str=L"\nBYE";
}

inline void CMsg::Set4Start(bool IsBack){
	state=IsBack?stSTARTBK:stSTART;
	PosX=PosY=0;
	str=L"\nSTART";
}

inline void CMsg::Set4Hit(_tag hitTag,int x,int y,bool IsBack){
	state=IsBack?stHITBK:stHIT;
	PosX=(int)hitTag;
	PosY=(int)(x<<16)|y;
	str=L"\nHIT";
}

inline void CMsg::Set4Lose(int x,int y,bool IsBack){
	state=IsBack?stLOSEBK:stLOSE;
	PosX=x;PosY=y;
	str=L"\nLOSE";
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -