Отправить другие типы данных в winsock2 - PullRequest
1 голос
/ 22 августа 2011

Функция отправки в winsock2 принимает только указатели на символы.Как я тоже могу посылать через него целые числа или объекты?

Ответы [ 3 ]

5 голосов
/ 22 августа 2011

const char *buf, который вам нужно передать функции send() в качестве аргумента, это просто указатель на массив байтов. Вам необходимо преобразовать целые числа в байты:

const int MAX_BUF_SIZE = 1024;
int int_data = 4;
const char *str_data = "test";

char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;

memcpy(&int_data, p, sizeof(int_data));
p += sizeof(int_data);

strcpy(p, str_data);
p += strlen(str_data) + 1;

send(sock, buf, p - buf, 0);

free(buf);

и код чтения:

const int MAX_BUF_SIZE = 1024;
int int_data = 0;
const char *str_data = NULL;

char *buf = (char*) malloc(MAX_BUF_SIZE);
char *p = buf;

recv(sock, buf, MAX_BUF_SIZE, 0);

memcpy(p, &int_data, sizeof(int_data));
p += sizeof(int_data);

str_data = malloc(strlen(p) + 1);
strcpy(str_data, p);
p += strlen(p) + 1;

free(buf);

и сложные объекты должны быть сериализованы для потока байтов.

Примечание 1. Пример кода действителен, если и сервер, и клиент используют одинаковые платформы (x32 / x64 / ...), что означает, что int имеет одинаковое количество байтов, а порядок байтов одинаков.

Примечание 2. При написании кода следует убедиться, что на каждом шаге нет переполнения буфера (MAX_BUF_SIZE).

2 голосов
/ 23 августа 2011

Просто сохраните значение в переменной, а затем приведите тип к переменной char*.Функции send() и recv() работают с двоичными данными, несмотря на принятие параметров char*.

Отправка:

int int_data = 4;
send(sock, (char*) &int_data, sizeof(int), 0);

Чтение:

int int_data;
recv(sock, (char*) &int_data, sizeof(int), 0);
0 голосов
/ 22 августа 2011

Как правило, самый простой способ - вывести целое число или объект в строку и отправить эту строку.Текстовые представления более переносимы, а также легче отлаживаются.

std::stringstream может быть полезным классом как для создания строки, так и для ее анализа на другом конце.

...