If you want to be really portable, then sending the floats as strings might be the best way to go.
That said, if you are okay with assuming that all computers will be using the IEEE754 floating point standard (which is a valid assumption for PC/Mac/Linux programming these days) then you can just send the raw data verbatim (i.e. send each float as 4 bytes via memcpy()).
The only wrinkle is if you want to deal with machines that use different endian-ness... e.g. sending from an Intel to a PowerPC machine. In that case, one of the machines will need to reverse the ordering of the 4 bytes before it sends them (and after it receives them) so that it will still interpret them the same as its counterpart. (There is no ntohf() or htonf() function, but you can byte-swap a float manually by memcpy()ing it to a int32_t, then byte-swapping the int32_t and sending that... on reception you would recv() the data into an int32_t, byte-swap the int32_t, then memcpy() the result into a float. Note that casting-and-assignment isn't sufficient here, you must use memcpy() to copy the data from int32_t to float and vice versa -- otherwise the lack of interoperability between the floating point and integer registers on some CPU types (e.g. Intel) will bite you and give you wrong results)