示例#1
0
BOOL buffer_fetch_DWORD(BUFFER *buf, BYTE **ptr, DWORD *d)
{
	BYTE *p = *ptr;

	if(!buffer_has_data(buf, p, sizeof(DWORD)))
		return FALSE;

	*d = BUF_FETCH_DWORD(p);

	*ptr = p;

	return TRUE;
}
示例#2
0
BOOL socket_fetch_DWORD(SOCKET sock, BUFFER *buf, BYTE **ptr, DWORD *d)
{
	int len;
	BYTE tmpbuf[1024];
	BYTE *p = *ptr;

	while (!buffer_has_data(buf, p, sizeof(DWORD))) {
		len = os_socket_tcp_recv_nonblock(sock, tmpbuf, sizeof(tmpbuf));
		buffer_append(buf, tmpbuf, len);
	}

	*d = BUF_FETCH_DWORD(p);
	*ptr = p;

	return TRUE;
}
示例#3
0
文件: tunet.c 项目: alick/mytunet
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;
}