read () и write () в сокеты, возвращающие поврежденные значения

Я пытался писать в сокет с помощью write() команда. Данные, которые мне нужно записать, имеют структурный тип и содержат char а также int значения типа данных. Но когда я записываю данные в сокет сервера, значение int переменная становится поврежденной. Я получаю значение как 16777216 всегда.

Я пишу из Solaris машина к Linux машина. Solaris это 32-битная машина и Linux это 64-битная машина. Это как-то повлияет на мою проблему.

я использовал htonl/ntohl и наоборот для прохождения intзначения eger от и до сервера. Но как я могу использовать это, если я пишу весь тип структуры в сокет? Может ли кто-нибудь помочь мне разобраться с этим?

PCHAR data = NULL;
int size = sizeof(WSMsg);
int retry = 10;
data = new char [sizeof(WSMsg)];
memcpy(data, msg, sizeof(WSMsg));
int n = write(fd, &data[0], size);

Это моя часть кода. Вот WSMsg имеет тип структуры и имеет int а также char введите значения.

Я пишу конкретную строку из таблицы базы данных, которая содержит число, char введите значения. И я пишу разные строки разных таблиц, как это. Так что, если мне нужно использовать htonl/ntohl тогда мне нужно преобразовать все эти числа в сетевые байты. Поскольку у меня есть 20 или более таблиц и их структур, которые имеют значения целочисленного типа, для меня будет трудоемкой задачей преобразовать все эти и отправить их.

0

Решение

Кажется, у вас проблемы с порядком байтов. Есть несколько способов решить эту проблему: Один из них — изучить сериализация, Т.е. преобразовать отправляемые вами структуры в формат, который не зависит от порядка следования байтов; Другое решение состоит в том, чтобы создать копию вашей структуры и использовать, например, htons/htonl где необходимо:

WSMsg temp = *msg;
temp.someShortField = htons(temp.someShortField);
// etc.

Тогда, конечно, сделайте обратное на принимающей стороне.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]