Проблема кодировки дейтаграммы сокета C ++ и node.js?

У меня есть некоторый код, написанный на c ++, который открывает сокет и отправляет дейтаграмму на мой сервер узлов. Проблема, кажется, у меня есть проблема с кодировкой …. или что-то еще не так.

Мой клиентский код на C ++ в двух словах

#include <winsock.h>
#include <string.h>
void DataPlugin::Startup( long version )
{
FILE *settings;
struct hostent *ptrh;
data_version = 1;
char portstring[10];

log("starting plugin");

// open socket
s = socket(PF_INET, SOCK_DGRAM, 0);
if (s < 0) {
log("could not create datagram socket");
return;
}
settings = fopen("DataSettings.ini", "r");
if (settings != NULL) {
log("reading settings");
if (fscanf(settings, "%[^:]:%i", hostname, &port) != 2) {
log("could not read host and port");
}
ptrh = gethostbyname(hostname);
fclose(settings);
log("hostname is:");
log(hostname);
log("port is:");
sprintf(portstring, "%i", port);
log(portstring);
}
else {
log("could not read settings, using defaults");
ptrh = gethostbyname("x.x.x.x"); /* Convert host name to equivalent IP address and copy to sad. */
port = 6789;
}
memset((char *)&sad, 0, sizeof(sad)); /* clear sockaddr structure */
sad.sin_family = AF_INET;           /* set family to Internet     */
sad.sin_port = htons((u_short) port);
if (((char *)ptrh) == NULL) {
log("invalid host name");
return;
}
memcpy(&sad.sin_addr, ptrh->h_addr, ptrh->h_length);
}

void DataPlugin::StartStream() {
data_packet = 0;
data_sequence++;
data[0] = data_version;
data[1] = data_packet;
memcpy(&data[2], &data_sequence, sizeof(short));
data_offset = 4;
}

void DataPlugin::StreamData(char *data_ptr, int length) {
int i;

for (i = 0; i < length; i++) {
if (data_offset + i == 512) {
sendto(s, data, 512, 0, (struct sockaddr *) &sad, sizeof(struct sockaddr));
data_packet++;
data[0] = data_version;
data[1] = data_packet;
memcpy(&data[2], &data_sequence, sizeof(short));
data_offset = 4;
length = length - i;
data_ptr += i;
i = 0;
}
data[data_offset + i] = data_ptr[i];
}
data_offset = data_offset + length;
}void DataPlugin::StreamString(char *data_ptr, int length) {
int i;

for (i = 0; i < length; i++) {
if (data_offset + i == 512) {
sendto(s, data, 512, 0, (struct sockaddr *) &sad, sizeof(struct sockaddr));
data_packet++;
data[0] = data_version;
data[1] = data_packet;
memcpy(&data[2], &data_sequence, sizeof(short));
data_offset = 4;
length = length - i;
data_ptr += i;
i = 0;
}
data[data_offset + i] = data_ptr[i];
if (data_ptr[i] == 0) {
// found end of string, so this is where we stop
data_offset = data_offset + i + 1;
return;
}
}
data_offset = data_offset + length;
}

char mTrackName[64] = "tester";
double mFuel = 6.43;

StartStream();
StreamData((char *)&type_scoring, sizeof(char));

// session data (changes mostly with changing sessions)
StreamString((char *)&mTrackName, 64);
StreamData((char *)&mSession, sizeof(long));

И мой код сервера node.js

var dgram = require('dgram');

var server = dgram.createSocket('udp4');
server.on('message', function(message, rinfo) {

console.log('server got message: ' + message +
' from ' + rinfo.address + ':' + rinfo.port);});

server.on('listening', function() {
var address = server.address();
console.log('server listening on ' + address.address +
':' + address.port);
});

server.bind(6789);

Пример вывода консоли на сервер узла

сервер получил сообщение: b $ ����F� @ �� @ об / мин: ����F� @: end | ��x� [@ �j�5�; \ @ ���x! @ �> �� @ �H (@ ��� | @ C�C� \? �A� �TM� �p | ��;??! g4 ~ @ = # e��@�u��6�?T�JF
v@�e� �u@�4ܫ��t@���?���:��@%��Ũ,
@��T�?^���t@��G���u@���_�8u@��Q�?|n��Jx�@Y�_�'@ �3�c�?) D��� @ u @ Fi�, �u @ �Y� (n�t @ `* H�? из x.x.x.x: 56793

Биты ‘rpm:’ и ‘: end’ были отправлены с использованием функции streamstring (), и они прекрасно работают … так как они начали жизнь как строки. Но когда я пытаюсь отправить число, либо необработанное, либо приведя его к типу char, сервер выплевывает кучу нечитаемого текста.

Любая помощь будет принята с благодарностью.

1

Решение

Задача ещё не решена.

Другие решения