Проблема кодировки дейтаграммы сокета 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�? от xxxx:56793

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

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

0 ответов

Другие вопросы по тегам