00001 #include <malloc.h> 00002 #include <string.h> 00003 #include <arpa/inet.h> 00004 #include "net/server_client_bin.h" 00005 #include "net/client_common.h" 00006 #include "net/packet.h" 00007 00008 bool ServerClientBin::ParseBuffer() 00009 { 00010 Lock(); 00011 if(buffer_len < 4) 00012 { 00013 Unlock(); 00014 return false; 00015 } 00016 00017 unsigned int pckt_size = ntohl(*(int*)buffer); 00018 00019 if(pckt_size <= buffer_len) 00020 { 00021 Packet* p = new Packet(buffer); 00022 HandlePacket(p); 00023 delete p; 00024 00025 // buffer_len can be 0 when HandlePacket() triggered a disconnect 00026 if(buffer_len == pckt_size || buffer_len == 0) 00027 { 00028 if(buffer) 00029 free(buffer); 00030 buffer = NULL; 00031 buffer_len = 0; 00032 Unlock(); 00033 return false; 00034 } 00035 00036 buffer_len -= pckt_size; 00037 char* new_buf = (char*)malloc(buffer_len); 00038 memcpy(new_buf, buffer + pckt_size, buffer_len); 00039 free(buffer); 00040 buffer = new_buf; 00041 Unlock(); 00042 return true; 00043 } 00044 Unlock(); 00045 return false; 00046 }
1.5.8