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; }
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; }
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; }