remove any std::string (or else) and use array of BYTE type in send and in receive functions.
My gues is that std::string mess up your data.
For receive allocate BYTE array and receive data in it.
As others say, this should work pretty good :
for send :

BYTE info[] =
{
0x84, 0xFA, 0xEF, 0x00,
0x01, 0xEF, 0x05, 0x31,
0x01, 0x01, 0x01, 0x20,
0xF9, 0xC7, 0xDC, 0x79,
0x80, 0x99, 0xF1, 0xF2,
0xF3
};

nBytesSent = send(Socket, info, sizeof(info), 0);

====================================
for receive :

BYTE info_recv[2000];
int rcv_bytes = recv(sock, info_recv, 2000, /* MSG_WAITALL */ or 0);

====================================
It is good also if you organize some header of each packet of data you send. With at least bytes expected inside. So receiver will know what length to expect.
Keep in mind that you may need to call recv() several times before to receive whole data that is send.
i.e. you may (and will) receive your data on several chunks, or 2 or more whole packets can be received at once.
So you should organize some Q of received data and at each completion of recv() to add data to this Q...then if whole packet (completely defined by you) is received, process it, remove ONLY bytes of processed packet from this Q...and continue to wait for next packets.