Esempio n. 1
0
static int tunet_logon_send_tunet_user()
{
	BUFFER *buf;
	BYTE tmpbuf[100];
	int len;
	UINT32 lang;

	BOOL sr, sw, se;
	
	if(!main_socket) return OK;
	
	os_socket_tcp_status(main_socket, &sr, &sw, &se);


	if(tunet_state != TUNET_STATE_LOGIN) 
		return OK;

	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "SEND_TUNET_USER", NULL, 0);
		return ERR;
	}

	if(!sw) return OK;


	buf = buffer_new(200);

	//hex2buf("12 54 55 4e 45 54 20 55 53 45 52 00 00 4e ea 00 00 00 01", tmpbuf, &len);
	//															   00 for english

	//buf = buffer_append(buf, tmpbuf, len);

	hex2buf("12 54 55 4e 45 54 20 55 53 45 52 00 00 4e ea", tmpbuf, &len);
	buf = buffer_append(buf, tmpbuf, len);

	lang = htonl(userconfig.language);
	buf = buffer_append(buf, (BYTE *)(&lang), 4);

	os_socket_tcp_send(main_socket, buf->data, buf->len);

	

	tunet_state = TUNET_STATE_RECV_WELCOME;

	logs_append(g_logs, "TUNET_LOGON_SEND_TUNET_USER", NULL, buf->data, buf->len);
	//dprintf("已经向主服务器发出登陆请求...\n");

	buf = buffer_free(buf);
	return OK;
}
Esempio n. 2
0
static int tunet_logout_send_logout()
{
	BOOL sr, sw, se;
	BYTE tmpbuf[1024];
	BUFFER *buf = NULL;
	INT len;

	if(!logout_socket) return OK;
	
	os_socket_tcp_status(logout_socket, &sr, &sw, &se);

	if(tunet_state != TUNET_STATE_LOGOUT)
		return OK;
//	printf("sending logout info.\n");
	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "SEND_LOGOUT", NULL, 0);
		return ERR;
	}

	if(!sw) return OK;

	hex2buf("0f 54 55 4e 45 54 20 55 53 45 52", tmpbuf, &len);

	buf = buffer_append(buf, tmpbuf, len);

	os_socket_tcp_send(logout_socket, buf->data, buf->len);

	

	tunet_state = TUNET_STATE_LOGOUT_RECV_LOGOUT;
	
	logs_append(g_logs, "TUNET_LOGON_SEND_LOGOUT", NULL, buf->data, buf->len);
	//dprintf("向主服务器发出注销请求...\n");

	buf = buffer_free(buf);
	return OK;
}
Esempio n. 3
0
static int  tunet_logout_recv_logout()
{
	BYTE tmpbuf[1024 * 8];
	CHAR  tmp[1024];

	BYTE  btag;
	UINT32  unknowntag;

	BYTE *p;

	int len;
	DWORD datalen;
	
	const CHAR *LOGOUT_TUNET = "LOGOUT TUNET";

	STRING *str = NULL;

	BOOL sr, sw, se;
	
	if(!logout_socket) return OK;
	os_socket_tcp_status(logout_socket, &sr, &sw, &se);

	
	if(tunet_state != TUNET_STATE_LOGOUT_RECV_LOGOUT) 
		return OK;


	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_LOGOUT", NULL, 0);
		return ERR;
	}

	if(!sr) return OK;

	len = os_socket_tcp_recv(logout_socket, tmpbuf, sizeof(tmpbuf));
	if(len == -1)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_LOGOUT", NULL, 0);
		return ERR;
	}

	if(len > 0)
	{
		logout_socket_buffer = buffer_append(logout_socket_buffer, tmpbuf, len);
		buf2output(tmpbuf, len, tmp, len);
		//dprintf("data received(logout):\n%s\n", tmp);


		logs_append(g_logs, "TUNET_LOGOUT_RECV", NULL, tmpbuf, len);

		p = logout_socket_buffer->data;
		while(buffer_fetch_BYTE(logout_socket_buffer, &p, &btag))
		{
//			printf("recv logout. 0x%x\n",btag);
			switch(btag)
			{
				case 0x10:

					if(!buffer_has_data(logout_socket_buffer, p, strlen(LOGOUT_TUNET) + 4))
						return OK;

					buffer_fetch_STRING(logout_socket_buffer, &p, &str, strlen(LOGOUT_TUNET));
					if(strcmp(str->str, LOGOUT_TUNET) != 0)
					{
						//dprintf("[tunet_logout_recv] unknown string\n");

						tunet_state = TUNET_STATE_ERROR;
						return OK;
					}
					str = string_free(str);
					buffer_fetch_DWORD(logout_socket_buffer, &p, &unknowntag);


					//say "we will logout"
					os_socket_tcp_send(logout_socket, (BYTE *)"\x0cLOGOUT", 7);
					logout_socket_buffer = buffer_rollto(logout_socket_buffer, p);
					p = logout_socket_buffer->data;


					break;

				//
				case 0x0d:
				case 0x0e:
					if(!buffer_fetch_DWORD(logout_socket_buffer, &p, &datalen))
						return OK;
					datalen = htonl(datalen);

					//dprintf("注销反馈消息长 %d\n", datalen);

					if(!buffer_fetch_STRING(logout_socket_buffer, &p, &str, datalen))
						return OK;

					//dprintf("%s\n", str->str);

					logs_append(g_logs, "TUNET_LOGOUT_MSG", str->str, NULL, 0);

					logs_append(g_logs, "TUNET_LOGOUT", NULL, NULL, 0);


					str = string_free(str);

					

					tunet_state = TUNET_STATE_NONE;

					logout_socket_buffer = buffer_rollto(logout_socket_buffer, p);
					p = logout_socket_buffer->data;
					break;

			}
		}

	}
	return OK;
}
Esempio n. 4
0
int tunet_keepalive()
{
	BYTE tmpbuf[1024];
	BYTE repbuf[9];
	CHAR tmp[1024];
	BYTE *p;
	BYTE btag;
	BYTE data[16];

	CHAR smoney[255];

	des_context ctx;
	int len;
	UINT32 uint_used_money, uint_money;
	STRING *str = NULL;
	
	BOOL sr, sw, se;
	
	if(!keepalive_socket) return OK;
	
	os_socket_tcp_status(keepalive_socket, &sr, &sw, &se);

	if(tunet_state != TUNET_STATE_KEEPALIVE)
		return OK;

	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "KEEPALIVE", NULL, 0);
		return ERR;
	}

	if(!sr) return OK;


	len = os_socket_tcp_recv(keepalive_socket, tmpbuf, sizeof(tmpbuf));
	if(len == -1)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "KEEPALIVE", NULL, 0);
		return ERR;
	}

	if(len > 0)
	{
		keepalive_socket_buffer = buffer_append(keepalive_socket_buffer, tmpbuf, len);
		buf2output(tmpbuf, len, tmp, 16);
		//dprintf("data received(keepalive):\n%s\n", tmp);


		logs_append(g_logs, "TUNET_KEEPALIVE_RECV", NULL, tmpbuf, len);

		p = keepalive_socket_buffer->data;
		while(buffer_fetch_BYTE(keepalive_socket_buffer, &p, &btag))
		{
			switch(btag)
			{
				case 0x03:

					if(!buffer_fetch_bytes(keepalive_socket_buffer, &p, data, 16))
						return OK;

					logs_append(g_logs, "TUNET_KEEPALIVE_CONFIRM", NULL, NULL, 0);

					uint_used_money = htonl(BUFDWORD( (data + 8) ));
					

					uint_money = htonl(BUFDWORD( (data + 12) ));
					

					des_set_key(&ctx, (uint8 *)keepalive_key);
					des_encrypt(&ctx, (uint8 *)data, (uint8 *)(repbuf + 1));
					repbuf[0] = 0x02;
					os_socket_tcp_send(keepalive_socket, repbuf, sizeof(repbuf));



					keepalive_socket_buffer = buffer_rollto(keepalive_socket_buffer, p);
					p = keepalive_socket_buffer->data;

					os_tick_clear(keepalive_timeout);

					snprintf(smoney, sizeof(smoney), "%0.2f", tunet_imoney_to_fmoney(uint_money));					
					logs_append(g_logs, "TUNET_KEEPALIVE_MONEY", smoney, NULL, 0);

					snprintf(smoney, sizeof(smoney), "%0.2f", tunet_imoney_to_fmoney(uint_used_money));					
					logs_append(g_logs, "TUNET_KEEPALIVE_USED_MONEY", smoney, NULL, 0);

					break; 


				case 0xff://ff 53 65 72 76 69 63 65 20 54 65 72 6d 69 6e 61 74 65 64 21 0d 0a
					tunet_state = TUNET_STATE_ERROR;

					str = string_nappend(str, (CHAR *)(keepalive_socket_buffer->data + 1), keepalive_socket_buffer->len - 1);
					logs_append(g_logs, "TUNET_KEEPALIVE_ERROR", str->str, NULL, 0);
					str = string_free(str);
			
					

					keepalive_socket_buffer = buffer_clear(keepalive_socket_buffer);

					break;
				default:
					tunet_state = TUNET_STATE_ERROR;

					logs_append(g_logs, "TUNET_KEEPALIVE_RECV_UNKNOWN", NULL, NULL, 0);

					//dprintf("%s\n", "意外的标记");

					
					break;
			}
		}
	}
	return OK;
}		
Esempio n. 5
0
static int tunet_logon_recv_remaining_data()
{
	BYTE tmpbuf[1024 * 8];
	CHAR tmp[1024];

	CHAR sztmp[255];

	BYTE *p;
	INT len;
	BYTE key77[8];
	
	STRING *str = NULL;
	char des3data[12];
	des3_context ctx3;
	TIME tm;


	UINT32 datalen, port;
	UINT32 uint_money;
	BYTE btag;


	BOOL sr, sw, se;
	
	if(!main_socket) return OK;
	
	os_socket_tcp_status(main_socket, &sr, &sw, &se);


	if(tunet_state != TUNET_STATE_RECV_REMAINING_DATA && tunet_state != TUNET_STATE_KEEPALIVE)
		return OK;



	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_REMAINING_DATA", NULL, 0);
		return ERR;
	}

	if(!sr) return OK;



	len = os_socket_tcp_recv(main_socket, tmpbuf, sizeof(tmpbuf));
	if(len == -1)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_REMAINING_DATA", NULL, 0);
		return ERR;
	}


	if(len > 0)
	{
		main_socket_buffer = buffer_append(main_socket_buffer, tmpbuf, len);
		logs_append(g_logs, "TUNET_LOGON_RECV", "REMAINING", tmpbuf, len);

		buf2output(tmpbuf, len, tmp, 16);
		//dprintf("data received(recv remaining):\n%s\n", tmp);

		

		p = main_socket_buffer->data;
		while(buffer_fetch_BYTE(main_socket_buffer, &p, &btag))
		{
			switch(btag)
			{
				case 0x01:
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;

					datalen = htonl(datalen);

					memset(keepalive_server, 0, sizeof(keepalive_server));
					if(!buffer_fetch_bytes(main_socket_buffer, &p, (BYTE *)keepalive_server, datalen))
						return OK;

					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &port))
						return OK;

					port = htonl(port);
					keepalive_server_port = (short)port;

					snprintf(sztmp, sizeof(sztmp), "%s:%d", keepalive_server, keepalive_server_port);
					//dprintf("保持活动服务器:%s\n", sztmp);



					//we got the KEEPALIVE server, try to keep alive
					os_tick_clear(keepalive_timeout);
					tunet_state = TUNET_STATE_KEEPALIVE;

					logs_append(g_logs, "TUNET_LOGON_KEEPALIVE_SERVER", sztmp, NULL, 0);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					break;
				case 0x02:
					//出错消息
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;
					datalen = htonl(datalen);

					//dprintf("出错消息长 %d\n", datalen);

					if(!buffer_fetch_STRING(main_socket_buffer, &p, &str, datalen))
						return OK;

					//dprintf("%s\n", str->str);


					tunet_state = TUNET_STATE_ERROR;

					logs_append(g_logs, "TUNET_LOGON_ERROR", str->str, NULL, 0);

					str = string_free(str);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					

					break;
				case 0x05:
					if(buffer_fetch_BYTE(main_socket_buffer, &p, &btag))
					{
						if(btag != 0)
						{
							//dprintf("与消息中介服务器通信结束。\n");
							main_socket = os_socket_tcp_close(main_socket);

							logs_append(g_logs, "TUNET_LOGON_FINISH_MSGSERVER", NULL, NULL, 0);

							main_socket_buffer = buffer_rollto(main_socket_buffer, p);
							p = main_socket_buffer->data;
							
							break;
						}
					}

					BUF_ROLL(p, -1);  //restore the point for further use


					//出错消息
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;
					datalen = htonl(datalen);

					//dprintf("出错消息长 %d\n", datalen);

					if(!buffer_fetch_STRING(main_socket_buffer, &p, &str, datalen))
						return OK;

					//dprintf("%s\n", str->str);
					
					tunet_state = TUNET_STATE_ERROR;

					logs_append(g_logs, "TUNET_LOGON_ERROR", str->str, NULL, 0);

					str = string_free(str);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					
					break;
					
				case 0x04:
				case 0x08:
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;

					datalen = htonl(datalen);

					memset(msg_server, 0, sizeof(msg_server));
					if(!buffer_fetch_bytes(main_socket_buffer, &p, (BYTE *)msg_server, datalen))
						return OK;

					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &port))
						return OK;

					port = htonl(port);

					msg_server_port = (short)port;

					if(!buffer_fetch_bytes(main_socket_buffer, &p, key77, 8))
						return OK;

					//登陆消息
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;
					datalen = htonl(datalen);

					//dprintf("登陆消息长 %d\n", datalen);

					if(!buffer_fetch_STRING(main_socket_buffer, &p, &str, datalen))
						return OK;
					//dprintf("%s\n", str->str);

					logs_append(g_logs, "TUNET_LOGON_MSG", str->str, NULL, 0);

					str = string_free(str);


					//make a new key for keep-alive
					//dprintf("key77 == %s\n", buf2hex(key77, 8, tmp));
					memset(des3data, 0, sizeof(des3data));
					des3_set_3keys( &ctx3, userconfig.md5Password,
										   userconfig.md5Password + 8,
										   userconfig.md5Password );

					des3_encrypt( &ctx3, (uint8 *)key77, (uint8 *)des3data);

					memcpy(keepalive_key, des3data, 8);


					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					//--------------------------------
					snprintf(sztmp, sizeof(sztmp), "%s:%d", msg_server, msg_server_port);

					//dprintf("准备连接到消息中介服务器 %s 获得活动服务器地址....\n", sztmp);

					logs_append(g_logs, "TUNET_LOGON_MSGSERVER", sztmp, NULL, 0);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					//switch to another server to get alive-server ip
					strcpy(keepalive_server, "");
					main_socket = os_socket_tcp_close(main_socket);
					main_socket = os_socket_tcp_connect(msg_server, msg_server_port, TRUE);

					break;
				case 0x1b:
					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &uint_money))
						return OK;

					uint_money = htonl(uint_money);
					snprintf(sztmp, sizeof(sztmp), "%0.2f", tunet_imoney_to_fmoney(uint_money));
					//dprintf("您在登陆前的余额是:%s\n", sztmp);

					logs_append(g_logs, "TUNET_LOGON_MONEY", sztmp, NULL, 0);

					if(buffer_has_data(main_socket_buffer, p, 16))
					{
						snprintf(sztmp, sizeof(sztmp), "%d.%d.%d.%d/%d.%d.%d.%d", p[0],p[1],p[2],p[3],p[4],p[5],p[6],p[7]);
						logs_append(g_logs, "TUNET_LOGON_IPs", sztmp, NULL, 0);
						//dprintf("登陆IP状况: %s\n", sztmp);
						BUF_ROLL(p, 8);

						
						tm = os_time_convert(htonl(BUFDWORD(p)));
						snprintf(sztmp, sizeof(sztmp), "%d-%d-%d %d:%d:%d", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second );
						logs_append(g_logs, "TUNET_LOGON_SERVERTIME", sztmp, NULL, 0);
						//dprintf("当前服务器时间: %s\n", sztmp);
						BUF_ROLL(p, 4);

						tm = os_time_convert(htonl(BUFDWORD(p)));
						snprintf(sztmp, sizeof(sztmp), "%d-%d-%d %d:%d:%d", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second );
						logs_append(g_logs, "TUNET_LOGON_LASTTIME", sztmp, NULL, 0);
						//dprintf("上次登陆时间: %s\n", sztmp);
						BUF_ROLL(p, 4);
					}
					else
					{
						return OK;
					}

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					break;
			}
		}

	}

	return OK;

}
Esempio n. 6
0
static int tunet_logon_reply_welcome()
{
	BUFFER *buf;

	BYTE des3data[12];
	des3_context ctx3;

	UINT32 limitation;


	BOOL sr, sw, se;
	
	if(!main_socket) return OK;
	
	os_socket_tcp_status(main_socket, &sr, &sw, &se);

	if(tunet_state != TUNET_STATE_REPLY_WELCOME) 
		return OK;


	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "REPLY_WELCOME", NULL, 0);
		return ERR;
	}

	if(!sw) return OK;


	memset(des3data, 0, sizeof(des3data));

    des3_set_3keys( &ctx3, userconfig.md5Password,
                           userconfig.md5Password + 8,
                           userconfig.md5Password );


	des3_encrypt( &ctx3, (uint8 *)welcome_data, (uint8 *)des3data);



	buf = buffer_new(100);
	buf = buffer_append(buf, (BYTE *)"\x03", 1);
	buf = buffer_append(buf, userconfig.md5Username, 16);
	buf = buffer_append(buf, des3data, 8);


	limitation = htonl(userconfig.limitation);
	buf = buffer_append(buf, (BYTE *)&limitation, 4);

	os_socket_tcp_send(main_socket, buf->data, buf->len);

	

	tunet_state = TUNET_STATE_RECV_REMAINING_DATA;

	logs_append(g_logs, "TUNET_LOGON_REPLY_WELCOME", NULL, buf->data, buf->len);

	//dprintf("%s\n", "已经应答welcome的数据包。准备接受剩余数据...");

	buf = buffer_free(buf);

	return OK;

}
Esempio n. 7
0
static int tunet_logon_recv_welcome()
{
	BYTE tmpbuf[1024 * 8];
	CHAR  tmp[1024];

	BYTE  btag;
	UINT32  unknowntag;
	UINT32  datalen;

	BYTE *p;

	int len;
	
	const CHAR *WELCOME = "WELCOME TO TUNET";
	//int msglen = 0;

	STRING *str = NULL;

	BOOL sr, sw, se;
	
	if(!main_socket) return OK;
	
	os_socket_tcp_status(main_socket, &sr, &sw, &se);

	if(tunet_state != TUNET_STATE_RECV_WELCOME) 
		return OK;


	if(se)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_WELCOME", NULL, 0);
		return ERR;
	}

	if(!sr) return OK;


	len = os_socket_tcp_recv(main_socket, tmpbuf, sizeof(tmpbuf));
	if(len == -1)
	{
		logs_append(g_logs, "TUNET_NETWORK_ERROR", "RECV_WELCOME", NULL, 0);
		return ERR;
	}
	if(len > 0)
	{
		main_socket_buffer = buffer_append(main_socket_buffer, tmpbuf, len);

		logs_append(g_logs, "TUNET_LOGON_RECV", "WELCOME", tmpbuf, len);

		buf2output(tmpbuf, len, tmp, 16);
		//dprintf("data received(recv welcome):\n%s\n", tmp);

		p = main_socket_buffer->data;
		while(buffer_fetch_BYTE(main_socket_buffer, &p, &btag))
		{
			switch(btag)
			{
				case 0x01:
					if(!buffer_fetch_STRING(main_socket_buffer, &p, &str, strlen(WELCOME)))
						return OK;

					if(strncmp(str->str, WELCOME, strlen(WELCOME)) != 0)
					{
						str = string_free(str);

						//TODO
						//process such error!!!!!!!!!
						logs_append(g_logs, "TUNET_LOGON_WELCOME", str->str, NULL, 0);
						tunet_state = TUNET_STATE_ERROR;
						return OK;
					}
					str = string_free(str);

					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &unknowntag))
						return OK;

					unknowntag = htonl(unknowntag);

					if(!buffer_fetch_bytes(main_socket_buffer, &p, welcome_data, 8))
						return OK;

					if(!buffer_fetch_DWORD(main_socket_buffer, &p, &datalen))
						return OK;
					
					datalen = htonl(datalen);
					//dprintf("欢迎消息长 %d\n", datalen);

					if(!buffer_fetch_STRING(main_socket_buffer, &p, &str, datalen))
						return OK;

					logs_append(g_logs, "TUNET_LOGON_WELCOME", str->str, NULL, 0);

					//dprintf("%s\n", str->str);
					str = string_free(str);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;

					tunet_state = TUNET_STATE_REPLY_WELCOME;			

					break;

				case 0x02: 
				case 0x05:
					datalen = htonl(BUF_FETCH_DWORD(p));
					//dprintf("出错消息长 %d\n", datalen);

					str = string_new("");
					str = string_nappend(str, (CHAR *)p, datalen);
					//dprintf("%s\n", str->str);

					tunet_state = TUNET_STATE_ERROR;

					logs_append(g_logs, "TUNET_LOGON_ERROR", str->str, NULL, 0);

					str = string_free(str);

					BUF_ROLL(p, datalen);

					main_socket_buffer = buffer_rollto(main_socket_buffer, p);
					p = main_socket_buffer->data;
				
					break;

			}
		}
		
	}

	return OK;
}