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

📄 csclient.h

📁 mysee网络直播源代码Mysee Lite是Mysee独立研发的网络视频流媒体播放系统。在应有了P2P技术和一系列先进流媒体技术之后
💻 H
字号:
/*
 *  Openmysee
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#ifndef _CSCLIENT_H_
#define _CSCLIENT_H_

namespace NPLayer1 {

class Communicator;
class BaseResource;

enum {
	// TS发来的UDP包的最大长度
	MAX_UDP_LEN = 1400, 
};

class CSClient {
public:
	CSClient(Communicator* c);
	~CSClient();

	// 解析消息
	BOOL ParseMsg(sockaddr_in& addr, int& addrlen);

	// 返回监听的Socket
	SOCKET GetSocket() { return m_Socket; };
	bool GetIsLogin() { return isLogin; }

	// 初始化,绑定一个监听端口
	P2P_RETURN_TYPE Init();

	void SendLogin();
	void SendResList();
	void SendReqRes();
	void SendDelRes(BaseResource* res);
	void SendReport(bool bRefresh);
	void SendNeedPeers();
	void SendQueryRes();
	void SendLogout();
	void SendReport2();

	void ResetLoginFail() {loginFailCount = 0;}

	// 利用memcpy复制数据,并且把src指针加上size
	static void CopyMoveSrc(void * des, const char *& src, size_t size);
	// 利用memcpy复制数据,并且把des指针加上size
	static void CopyMoveDes(char *& des, const void * src, size_t size);

private:
	BOOL OnWelcome();
	BOOL OnPeers();
	BOOL OnConnectTo();
	BOOL OnResInfo();
	BOOL OnMsg();

	BOOL SwitchMsg(UINT8 msgType);

	// 每次编制发送消息时,第一步的操作
	BOOL SendBegin(UINT8 msgType);
	// 每次编制发送消息时,最后一步的操作
	void SendEnd();
	// 取得本机IP地址列表
	static UINT8 GetLocalIPList(in_addr*&);

	// 重新初始化
	void Reinit();

private:
	enum {
		// 当发现known peer个数过少时,才发送NP2TS_NEED_PEERS
		MIN_KNOWN_PEERS=15,
		// 因为NP拥有的块可能有很多区间,但是不可能全部提交给TS,
		// 而且大多数情况下区间个数不会超过MAX_BLOCK_INTERVALS个,所以定义一个提交的最大个数
		MAX_BLOCK_INTERVALS = 20,
		// 连续登陆失败的次数,如果连续失败MAX_LOGIN_FAIL_COUNT次,就向界面报告
		MAX_LOGIN_FAIL_COUNT = 10, 
	};

	// 监听的Socket
	SOCKET m_Socket;
	// 是否已经成功登陆
	bool isLogin;
	// 是否继续登陆
	bool bStopLogin;
	// 是否成功请求了资源
	bool isReqResSucceed;
	// 接收数据的缓冲区
	char recvBuf[MAX_UDP_LEN];
	// 从接收到的数据包读取数据的移动指针,同样是
	// 向被发送的数据包写入数据的移动指针
	char* content;

	// 登陆失败的次数
	UINT loginFailCount;
	// 初始值是MAX_LOGIN_FAIL_COUNT,每次失败变成MAX_LOGIN_FAIL_COUNT倍
	UINT maxFailCount;

	// 发送消息的互斥变量
	CriticalSection sendCS;

	// TS返回的验证码
	char checkCode[7];

	Communicator* comm;

	// TEST: 测试代码,因为有时候Login之后NeedPeers不返回,只好再次登录
	// 利用这个变量记录上次收到Peers消息的时间,如果30秒内没收到新的Peers,就重新登录
	DWORD lastRecvPeers;
};
}

#endif

⌨️ 快捷键说明

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