How to package pressure, temperature and humidity data for UPD/TCP?
If you are the one writing the software on both ends, then it's fully up to you.
The simplest way is to store all the data you want to send into a struct, and then send the struct. Something like:
struct DataPacket
{
    uint16_t temperature;
    uint16_t humidity;
    uint16_t pressure;
} __attribute__((packed));

void send_current_data() {
    struct DataPacket packet;
    packet.temperature = get_temperature();
    packet.humidity = get_humidity();
    packet.pressure = get_pressure();
    send(udp_connection, &amp;packet, sizeof packet);
}

What this actually does is it sends 6 bytes; first a temperature in uint16_t format, then a humidity in uint16_t format, then a pressure in uint16_t format. Your server receives the data and uses the same struct (or any other method) to unpack it. Pay attention to endianness - a uint16_t on the server might not be the same format as a uint16_t on the microcontroller, you might need to byte-swap it.
Of course if 16 bits are not enough you can change it to uint32_t, or any other type.
Also pay attention to __attribute__((packed)) which tells the compiler not to insert any padding between struct members. In this particular case it's not required because no padding is required in this structure. If your CPU does need padding, you'll have to add it yourself, to make sure it's consistent on the client and the server.
Padding is added to ensure that 16-bit variables are aligned at multiples of 16 bits, 32-bit variables are aligned at multiples of 32 bits, and so on. If all the variables are the same size then it's not needed.