/** * return the package total length */ ssize_t swProtocol_get_package_length(swProtocol *protocol, swConnection *conn, char *data, uint32_t size) { uint16_t length_offset = protocol->package_length_offset; uint8_t package_length_size = protocol->get_package_length_size ? protocol->get_package_length_size(conn) : protocol->package_length_size; int32_t body_length; /** * no have length field, wait more data */ if (size < length_offset + package_length_size) { protocol->real_header_length = length_offset + package_length_size; return 0; } body_length = swoole_unpack(protocol->package_length_type, data + length_offset); //Length error //Protocol length is not legitimate, out of bounds or exceed the allocated length if (body_length < 0) { swWarn("invalid package, remote_addr=%s:%d, length=%d, size=%d.", swConnection_get_ip(conn), swConnection_get_port(conn), body_length, size); return SW_ERR; } swDebug("length=%d", protocol->package_body_offset + body_length); //total package length return protocol->package_body_offset + body_length; }
void swoole_dump_bin(char *data, char type, int size) { int i; int type_size = swoole_type_size(type); int n = size / type_size; for(i = 0; i < n; i++) { printf("%d,", swoole_unpack(type, data + type_size*i)); } printf("\n"); }