The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Передача структур через сокеты UNIX"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Передача структур через сокеты UNIX"  +/
Сообщение от GreenHouse email(ok) on 29-Ноя-09, 15:23 
Программирую на С++ под os Linux Ubuntu(компилятор разумеется gcc version 4.4.1), платформа Intel i386. Заметил такую особенность:когда создаеш обьект какой нибудь структуры, то этот обьект в память занимает места больше чем сума размеров полей этой структуры, за счёт того что между полями ставится разделитель( 1 пустой байт).
Вопрос: в каждой ли платформе и операционной системе этот разделитель занимает 1 байт?
Не получится ли такой ситуации:
есть стуктура
struct test
{
    int id;
    char c;
};
Эта структура весит 6 байт на моей платформе, я передаю её по сети через сокет(как масив байтов). А на другой плотформе( куда мы передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому при работе с полученым массивом байтов как со структурой test может получится колизия. ???
И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp или icq? эти протоколы тоже должны (наверное) передавать структуры по сети между разными платформами. Как они заботятся о том что эти структуры будут иметь одинаковый размер на всех платформах?
Высказать мнение | Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Передача структур через сокеты UNIX"  +/
Сообщение от TyLLIKAH on 29-Ноя-09, 16:36 
>Программирую на С++ под os Linux уже второй день

UNIX Разработка сетевых приложений. Автор Стивенс и компания. Издание как минимум 3е. Вам очень нужна эта книга

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Передача структур через сокеты UNIX"  +/
Сообщение от GreenHouse email(ok) on 29-Ноя-09, 18:43 
>>Программирую на С++ под os Linux уже второй день
>
>UNIX Разработка сетевых приложений. Автор Стивенс и компания. Издание как минимум 3е.
>Вам очень нужна эта книга

Именно при  помощи этой книги я и разбирался с сетевым програмированием. Но интересующая меня тема затрогута слабо. Хотя возможно я что то пропостил.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Передача структур через сокеты UNIX"  +/
Сообщение от ACCA (ok) on 30-Ноя-09, 01:40 
>Именно при  помощи этой книги я и разбирался с сетевым програмированием.
>Но интересующая меня тема затрогута слабо. Хотя возможно я что то
>пропостил.

Я бы сказал - очень существенную часть пропустил.

Во-первых размер int может быть от 16 бит и больше. Во-вторых есть такая весёлая штука как big или little endian. В-третьих атрибуты (поля) структуры могут дополняться до полного машинного слова, а то и до страницы памяти (называется alignment), это определяется ключами и директивами компилятора.

Совершенно не гарантируется, что на принимающей стороне представление структуры в памяти совпадёт с представлением отправителя.

То, что ты хочешь сделать, называется сериализация - преобразование структуры в последовательный поток байтов и обратно. В общем случае достаточно сложная задача. Лучше не изобретай велосипед, а найди подходящую готовую библиотеку. Есть модная штука под называнием JSON. Посмотри, что это такое. Можно и XML гонять, собственно libxml в Linux на большее не годится.

Всякие RPC, COBRA, SOAP и мекрософтовые подделки под них вроде DCOM считаются устаревшими. Хотя можешь использовать и их.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Передача структур через сокеты UNIX"  +/
Сообщение от GreenHouse email(??) on 30-Ноя-09, 11:55 
Спасибо за подсказку, сейчас буду с этим разбиратся.


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Передача структур через сокеты UNIX"  +/
Сообщение от OnlySlon (??) on 29-Ноя-09, 18:57 
>[оверквотинг удален]
>};
>Эта структура весит 6 байт на моей платформе, я передаю её по
>сети через сокет(как масив байтов). А на другой плотформе( куда мы
>передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому
>при работе с полученым массивом байтов как со структурой test может
>получится колизия. ???
>И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp
>или icq? эти протоколы тоже должны (наверное) передавать структуры по сети
>между разными платформами. Как они заботятся о том что эти структуры
>будут иметь одинаковый размер на всех платформах?

#pragma pack() тебе в помосч

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Передача структур через сокеты UNIX"  +/
Сообщение от аноним on 30-Ноя-09, 14:52 
>этой структуры, за счёт того что между полями ставится разделитель( 1
>пустой байт)

Нет никаких разделителей. Есть выравнивание. И что это за система, где эта структура занимает 6 байт? На i386 и amd64 она занимает ровно 8 байт.

>сети через сокет(как масив байтов). А на другой плотформе( куда мы
>передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому
>при работе с полученым массивом байтов как со структурой test может
>получится колизия. ???

Может получиться что угодно. На разных платформах могут быть совершенно разные размеры int, char, разные правила выравнивания и разный порядок байт (little/big endian). Поэтому для бинарных протоколов надо использовать типы с фиксированным размером (u)int(8|16|32)_t, hton* и ntoh* функции для преобразования порядка байт (man ntohs) и упакованные структуры.

>И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp
>или icq? эти протоколы тоже должны (наверное) передавать структуры по сети
>между разными платформами. Как они заботятся о том что эти структуры
>будут иметь одинаковый размер на всех платформах?

Протокол может быть текстовым (какими и являются, например, ftp, http, smtp, pop3 и множество других). Если бинарным, тогда см. выше. Чтобы облегчить жизнь программиста во втором случае, придумали такие вещи как protocol buffers и библиотеки для работы с ASN.1. А первое можно довести до маразма, использовав XML.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру