This commit is contained in:
aozhiwei 2023-05-28 15:28:46 +08:00
parent b6e0b07313
commit 126d511bfb
2 changed files with 51 additions and 9 deletions

View File

@ -63,11 +63,35 @@ namespace a8
tcp_client_->on_socketread =
[this] (a8::AsioTcpClient* socket, char* buf, unsigned int buflen)
{
if (!handshook_) {
buf[buflen] = '\0';
} else {
unsigned int already_read_bytes = 0;
do {
if (already_read_bytes < buflen) {
int read_bytes = std::min(buflen - already_read_bytes,
(unsigned int)max_packet_len_ - recv_bufflen_);
if (read_bytes > 0) {
memmove(&recv_buff_[recv_bufflen_], buf + already_read_bytes, read_bytes);
recv_bufflen_ += read_bytes;
already_read_bytes += read_bytes;
}
}
}
int offset = 0;
int prev_offset = 0;
do {
prev_offset = offset;
DecodePacket(recv_buff_, offset, recv_bufflen_);
} while (prev_offset < offset && offset < recv_bufflen_);
if (offset > 0 && offset < recv_bufflen_){
memmove(recv_buff_, recv_buff_ + offset, recv_bufflen_ - offset);
}
recv_bufflen_ -= offset;
if (recv_bufflen_ >= max_packet_len_) {
//收到超长包
Close();
return;
}
} while (already_read_bytes < buflen);
};
}
@ -129,7 +153,7 @@ namespace a8
if (strstr(buf + offset, WEB_SOCKET_KEY) || strstr(buf + offset, WEB_SOCKET_KEY2)) {
ProcessWsHandShake(buf, offset, buflen);
} else {
//ProcessHttpHandShake(buf, offset, buflen);
abort();
}
}
@ -183,20 +207,18 @@ namespace a8
int prev_offset = 0;
do {
prev_offset = offset;
//DecodeUserPacket(decoded_buff_, offset, decoded_bufflen_);
DecodeUserPacket(decoded_buff_, offset, decoded_bufflen_);
} while (prev_offset < offset && offset < decoded_bufflen_);
if (offset > 0 && offset < decoded_bufflen_){
memmove(decoded_buff_, decoded_buff_ + offset, decoded_bufflen_ - offset);
}
decoded_bufflen_ -= offset;
#if 0
if (decoded_bufflen_ >= max_packet_len_) {
//收到超长包
Close();
return;
}
#endif
}
void WebSocketClient::DecodeFrame(char* buf, int& offset, unsigned int buflen)
@ -276,6 +298,21 @@ namespace a8
offset += real_pkg_len;
}
void WebSocketClient::DecodePacket(char* buf, int& offset, unsigned int buflen)
{
if (!handshook_) {
buf[buflen] = '\0';
ProcessHandShake(buf, offset, buflen);
} else {
DecodeFrame(buf, offset, buflen);
}
}
void WebSocketClient::DecodeUserPacket(char* buf, int& offset, unsigned int buflen)
{
}
}
#endif

View File

@ -29,16 +29,21 @@ namespace a8
void SendBuff(const char* buff, unsigned int bufflen);
private:
void DecodePacket(char* buf, int& offset, unsigned int buflen);
void DecodeUserPacket(char* buf, int& offset, unsigned int buflen);
void ProcessHandShake(char* buf, int& offset, unsigned int buflen);
void ProcessWsHandShake(char* buf, int& offset, unsigned int buflen);
void ProcessUserPacket();
void DecodeFrame(char* buf, int& offset, unsigned int buflen);
private:
std::shared_ptr<AsioTcpClient> tcp_client_;
char *decoded_buff_ = nullptr;
int decoded_bufflen_ = 0;
bool handshook_ = false;
char *recv_buff_ = nullptr;
int recv_bufflen_ = 0;
int max_packet_len_ = 0;
};
}