sendto(SOCKET s, const char *buf, int len, int flags, const sockaddr *to, int tolen);
で、第三引数にstrlen(data)を渡してたのが問題だったみたいです。
sizeof(Test)にしたら問題なく送信できました。

が、受信したあと、char*型に入ってる受信データをTest型の変数に代入できません。
dataがchar*型で、
((Test*)data)->a とするとちゃんと値を得ることができます。

Test t = (Test)*data;とすると、charをTestに変換できないとエラーがでます。

Test *buf = (Test*)data;
Test t = *buf;
とすると、tの値が狂います