Я пытался писать в сокет с помощью 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 или более таблиц и их структур, которые имеют значения целочисленного типа, для меня будет трудоемкой задачей преобразовать все эти и отправить их.
Кажется, у вас проблемы с порядком байтов. Есть несколько способов решить эту проблему: Один из них — изучить сериализация, Т.е. преобразовать отправляемые вами структуры в формат, который не зависит от порядка следования байтов; Другое решение состоит в том, чтобы создать копию вашей структуры и использовать, например, htons
/htonl
где необходимо:
WSMsg temp = *msg;
temp.someShortField = htons(temp.someShortField);
// etc.
Тогда, конечно, сделайте обратное на принимающей стороне.
Других решений пока нет …