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

📄 px_ss_module_work.c

📁 MMORPG游戏服务器端架构及函数
💻 C
📖 第 1 页 / 共 2 页
字号:
	return;
}
void px_ss_do_state_request_init(){
	init_get_basepath();
	init_winsock2();
	init_read_config();
	init_common_var();
	init_read_cl_version();
	init_read_rs_version();
	init_module_cl();
	init_module_rs();
	set_ss_state(STATE_MAIN_INIT_DONE);
	return;
}
void px_ss_do_state_init_done(){
	int seconds;
	Sleep(100);
	seconds = GetSecondsByint64(g_state->curr_time - g_state->prev_time);
	if (seconds >= 1) {
		set_ss_state(STATE_MAIN_RUN);
	}
	return;
}
void px_ss_do_state_run(){
	//handle time service
	if (g_time_service->time_start == 0) {
		memset(g_time_service,0,sizeof(PX_SS_TIME_SERVICE));
		g_time_service->time_start = GetTime64();
		g_time_service->time_current = GetTime64();
	}else{
		g_time_service->time_cycle = GetTime64();
		g_time_service->time_current = GetTime64();
		g_time_service->time_persist = g_time_service->time_current - g_time_service->time_start;
		g_time_service->frame_fact++;
		g_time_service->frame_theory = GetMillionSecondsByint64(g_time_service->time_persist)*60/1000;
	}
	//handle rs first
	if (valid_module_rs_state(STATE_MODULE_NO_INIT)) {
		init_module_rs();
	}else if (valid_module_rs_state(STATE_MODULE_REQUEST_INIT)) {
		//do nothing
	}else if (valid_module_rs_state(STATE_MODULE_INIT_DONE)) {
		SetEvent(h_event_module_rs);
	}else if (valid_module_rs_state(STATE_MODULE_RUN)) {
		handle_module_rs_recv_buf();
	}else if (valid_module_rs_state(STATE_MODULE_INACTIVE)) {
		if (g_time_service->frame_theory - g_state->frame_rs >= 60*5) {
			close_all_rs();
			close_module_rs();
			free_module_rs_resource();
			set_module_rs_state(STATE_MODULE_NO_INIT);
		}
	}else if (valid_module_rs_state(STATE_MODULE_ERROR_FOUND)) {
		if (g_time_service->frame_theory - g_state->frame_rs >= 60*2) {
			close_all_rs();
			close_module_rs();
			free_module_rs_resource();
			set_module_rs_state(STATE_MODULE_NO_INIT);
		}
	}
	//handle cl seconds
	if (valid_module_cl_state(STATE_MODULE_INIT_DONE)) {
		init_module_cl();
	}else if (valid_module_cl_state(STATE_MODULE_REQUEST_INIT)) {
		//do nothing
	}else if (valid_module_cl_state(STATE_MODULE_INIT_DONE)) {
		SetEvent(h_event_module_cl);
	}else if (valid_module_cl_state(STATE_MODULE_RUN)) {
		handle_module_cl_recv_buf();
	}else if (valid_module_cl_state(STATE_MODULE_INACTIVE)) {
		if (g_time_service->frame_theory - g_state->frame_cl >= 60*5) {
			close_all_client();
			close_module_cl();
			free_module_cl_resource();
			set_module_cl_state(STATE_MODULE_NO_INIT);
		}
	}else if (valid_module_cl_state(STATE_MODULE_ERROR_FOUND)) {
		if (g_time_service->frame_theory - g_state->frame_cl >= 3) {
			close_all_client();
			close_module_cl();
			free_module_cl_resource();
			set_module_cl_state(STATE_MODULE_NO_INIT);
		}
	}
	//handle other logic
	if (g_time_service->frame_theory - g_time_service->module_cl_heartbreak_frame >= 20) {
		handle_module_cl_heartbreak();
		g_time_service->module_cl_heartbreak_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->moduel_rs_heartbreak_frame >= 30) {
		handle_module_rs_heartbreak();
		g_time_service->moduel_rs_heartbreak_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_cl_reuse_frame >= 45) {
		handle_module_cl_reuse();
		g_time_service->module_cl_reuse_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->moduel_rs_reuse_frame >= 50) {
		handle_module_rs_reuse();
		g_time_service->moduel_rs_reuse_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_rs_status_frame >= 25) {
		update_module_rs_status();
		g_time_service->module_rs_status_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_rs_cache_frame >= 60) {
		update_module_rs_cache();
		g_time_service->module_rs_cache_frame = g_time_service->frame_theory;
	}
	return;
}
void px_ss_do_state_request_close(){
	int seconds;
	//handle time service
	g_time_service->time_cycle = GetTime64();
	g_time_service->time_current = GetTime64();
	g_time_service->time_persist = g_time_service->time_current - g_time_service->time_start;
	g_time_service->frame_fact++;
	g_time_service->frame_theory = GetMillionSecondsByint64(g_time_service->time_persist)*60/1000;
	g_state->curr_time = GetTime64();
	seconds = GetSecondsByint64(g_state->curr_state - g_state->prev_time);
	if (seconds >= 5) {
		set_ss_state(STATE_MAIN_CLOSING);
		return;
	}
	//handle module rs
	if (valid_module_rs_state(STATE_MODULE_INIT_DONE)) {
		SetEvent(h_event_module_rs);
	}else if (valid_module_rs_state(STATE_MODULE_RUN)) {
		handle_module_rs_recv_buf();
	}else if (valid_module_rs_state(STATE_MODULE_INACTIVE)) {
		if (g_time_service->frame_theory - g_state->frame_rs >= 60*5) {
			close_all_rs();
			close_module_rs();
			free_module_rs_resource();
			set_module_rs_state(STATE_MODULE_NO_INIT);
		}
	}else if (valid_module_rs_state(STATE_MODULE_ERROR_FOUND)) {
		if (g_time_service->frame_theory - g_state->frame_rs >= 60*2) {
			close_all_rs();
			close_module_rs();
			free_module_rs_resource();
			set_module_rs_state(STATE_MODULE_NO_INIT);
		}
	}
	//handle cl seconds
	if (valid_module_cl_state(STATE_MODULE_INIT_DONE)) {
		SetEvent(h_event_module_cl);
	}else if (valid_module_cl_state(STATE_MODULE_RUN)) {
		handle_module_cl_recv_buf();
	}else if (valid_module_cl_state(STATE_MODULE_INACTIVE)) {
		if (g_time_service->frame_theory - g_state->frame_cl >= 60*5) {
			close_all_client();
			close_module_cl();
			free_module_cl_resource();
			set_module_cl_state(STATE_MODULE_NO_INIT);
		}
	}else if (valid_module_cl_state(STATE_MODULE_ERROR_FOUND)) {
		if (g_time_service->frame_theory - g_state->frame_cl >= 3) {
			close_all_client();
			close_module_cl();
			free_module_cl_resource();
			set_module_cl_state(STATE_MODULE_NO_INIT);
		}
	}
	//handle other logic
	if (g_time_service->frame_theory - g_time_service->module_cl_heartbreak_frame >= 20) {
		handle_module_cl_heartbreak();
		g_time_service->module_cl_heartbreak_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->moduel_rs_heartbreak_frame >= 30) {
		handle_module_rs_heartbreak();
		g_time_service->moduel_rs_heartbreak_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_cl_reuse_frame >= 45) {
		handle_module_cl_reuse();
		g_time_service->module_cl_reuse_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->moduel_rs_reuse_frame >= 50) {
		handle_module_rs_reuse();
		g_time_service->moduel_rs_reuse_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_rs_status_frame >= 25) {
		update_module_rs_status();
		g_time_service->module_rs_status_frame = g_time_service->frame_theory;
	}
	if (g_time_service->frame_theory - g_time_service->module_rs_cache_frame >= 60) {
		update_module_rs_cache();
		g_time_service->module_rs_cache_frame = g_time_service->frame_theory;
	}
	//
	if (g_time_service->frame_theory - g_time_service->frame_request_close >= 3) {
		send_all_rs_ss_need_close();
		send_all_cl_ss_need_close();
		g_time_service->frame_request_close = g_time_service->frame_theory;
	}
	return;
}
void px_ss_do_state_closing(){
	//handle time service
	g_time_service->time_cycle = GetTime64();
	g_time_service->time_current = GetTime64();
	g_time_service->time_persist = g_time_service->time_current - g_time_service->time_start;
	g_time_service->frame_fact++;
	g_time_service->frame_theory = GetMillionSecondsByint64(g_time_service->time_persist)*60/1000;
	g_state->curr_time = GetTime64();

	//handle module rs
	close_all_rs();
	close_module_rs();

	//handle module cl
	close_all_client();
	close_module_cl();

	Sleep(1000);
	set_ss_state(STATE_MAIN_FREE_RESOURCE);
	return;
}
void px_ss_do_state_free_resource(){
	//handle time service
	g_time_service->time_cycle = GetTime64();
	g_time_service->time_current = GetTime64();
	g_time_service->time_persist = g_time_service->time_current - g_time_service->time_start;
	g_time_service->frame_fact++;
	g_time_service->frame_theory = GetMillionSecondsByint64(g_time_service->time_persist)*60/1000;
	g_state->curr_time = GetTime64();

	//handle module rs
	free_module_rs_resource();
	free_module_rs_area_resource();

	//handle module cl
	free_module_cl_resource();

	//handle other logic
	free_winsock2();
	free_cl_version();
	free_rs_version();
	free_common_var();

	set_ss_state(STATE_MAIN_NO_INIT);
	return;
}
void px_ss_do_state_error_found(){
	//handle time service
	g_time_service->time_cycle = GetTime64();
	g_time_service->time_current = GetTime64();
	g_time_service->time_persist = g_time_service->time_current - g_time_service->time_start;
	g_time_service->frame_fact++;
	g_time_service->frame_theory = GetMillionSecondsByint64(g_time_service->time_persist)*60/1000;
	g_state->curr_time = GetTime64();

	//handle module rs
	close_all_rs();
	close_module_rs();

	//handle module cl
	close_all_client();
	close_module_cl();

	Sleep(1000);

	//handle other logic
	free_module_rs_resource();
	free_module_rs_area_resource();
	free_module_cl_resource();
	free_winsock2();
	free_cl_version();
	free_rs_version();
	free_common_var();
	set_ss_state(STATE_MAIN_NO_INIT);
	return;
}
/************************************************************************
main work thread entry
************************************************************************/
DWORD WINAPI ss_module_work_thread(PVOID param){
	while (bln_run_work) {
		EnterCriticalSection(g_state->cts_state);
		switch(g_state->curr_state) {
	case STATE_MAIN_NO_INIT:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_no_init();
		break;
	case STATE_MAIN_REQUEST_INIT:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_request_init();
		break;
	case STATE_MAIN_INIT_DONE:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_init_done();
		break;
	case STATE_MAIN_RUN:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_run();
		break;
	case STATE_MAIN_REQUEST_CLOSE:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_request_close();
		break;
	case STATE_MAIN_CLOSING:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_closing();
		break;
	case STATE_MAIN_FREE_RESOURCE:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_free_resource();
		break;
	case STATE_MAIN_ERROR_FOUND:
		LeaveCriticalSection(g_state->cts_state);
		px_ss_do_state_error_found();
		break;
	default:
		LeaveCriticalSection(g_state->cts_state);
		break;
		}
	}
	return 0;
}
























































⌨️ 快捷键说明

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