2015-06-01 2 views
1

Я работаю над программой управления удаленным доступом. Мне нужно отправить и получить сразу несколько данных. Я использую это решение:Небезопасно ли отправлять и получать необработанные структуры через сокеты?

struct PACKET 
{ 
    int x; 
    int y; 
}; 

//... 
PACKET p; 
p.x = 10; 
p.y = 5; 
send(socket, (char*)&p, sizeof(PACKET), 0); 

Однако я рассматриваю вопрос, является ли это безопасным способом. Должен ли я найти другое решение?

+1

Как вы можете видеть в ответе vsoftcos, есть много подводных камней. Если вы не хотите беспокоиться о них, есть [Google Protobuf] (https://github.com/google/protobuf/), который заботится о многом для вас. Однако он добавляет еще один шаг компилятора для вас. – Slyps

ответ

1

Это небезопасно, если вы не можете гарантировать, что ваша структура - это POD, что и в вашем случае, и что на обеих платформах используется тот же endianness, который вы не знаете.

EDIT

Есть некоторые дополнительные вопросы, которые могут возникнуть: выравнивание один (компилятор может подушечку структуры с дополнительными битами), то сами данные могут быть представлены с использованием различных моделей. Спасибо @Andrew и @Slyps за комментарии.

Так что, в конце концов, кажется, что, если вы точно не знаете, что вы используете для выравнивания/представления данных на обеих платформах, вы небезопасны.

+0

Ну, вы все равно можете знать о контенте, если вы контролируете обе конечные точки соединения. –

+0

@GregHewgill Да, это правда, если вы пишете программу для своего собственного удаленного устройства. Отредактировал его. – vsoftco

+0

Не только конкретизация - модель данных и особенности компилятора. «Длинные» в модели данных ILP32 отличаются от «длинной» в модели данных LP64. Различные компиляторы и/или параметры оптимизации также могут изменить способ компоновки структуры. –