Yes, the socket module will represent the data that it receives as a string. However, the string still should contain the binary data however you sent it initially. Perhaps you could give a sample of what you expect your data to look like, as well as what you seem to be seeing.
If it is binary data, it won't print well and you may need to process it somewhat to better interpret what is being passed around. One fairly quick and easy way is to call repr() on the string, which will escape most characters for better interpretation.
Also, I see that you're receiving in maximum sizes of 256 on the tcp side, and then forwarding on what you receive. TCP is stream based and will happily give you 256 bytes. The mesh is datagram based, with a significantly smaller max payload, something around 70 bytes I believe. If you pass data beyond that into the 'sendto' call, that is an error. It will give a short return and will not transmit all that was passed. Your application will probably need to segment the data to pass it on in full. This could be part of the reason your remote device does not behave as you desire.