<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Передача структур через сокеты UNIX</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html</link>
    <description>Программирую на С++ под os Linux Ubuntu(компилятор разумеется gcc version 4.4.1), платформа Intel i386. Заметил такую особенность:когда создаеш обьект какой нибудь структуры, то этот обьект в память занимает места больше чем сума размеров полей этой структуры, за счёт того что между полями ставится разделитель( 1 пустой байт).&lt;br&gt;Вопрос: в каждой ли платформе и операционной системе этот разделитель занимает 1 байт?&lt;br&gt;Не получится ли такой ситуации:&lt;br&gt;есть стуктура &lt;br&gt;struct test&lt;br&gt;&#123;&lt;br&gt;    int id;&lt;br&gt;    char c;&lt;br&gt;&#125;; &lt;br&gt;Эта структура весит 6 байт на моей платформе, я передаю её по сети через сокет(как масив байтов). А на другой плотформе( куда мы передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому при работе с полученым массивом байтов как со структурой test может получится колизия. ???&lt;br&gt;И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp или icq? эти протоколы тоже должны (наверное) передавать структуры по сети между разными платформами. Как они заботятся о том что эти с</description>

<item>
    <title>Передача структур через сокеты UNIX (аноним)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#6</link>
    <pubDate>Mon, 30 Nov 2009 11:52:23 GMT</pubDate>
    <description>&amp;gt;этой структуры, за счёт того что между полями ставится разделитель( 1 &lt;br&gt;&amp;gt;пустой байт)&lt;br&gt;&lt;br&gt;Нет никаких разделителей. Есть выравнивание. И что это за система, где эта структура занимает 6 байт? На i386 и amd64 она занимает ровно 8 байт.&lt;br&gt;&lt;br&gt;&amp;gt;сети через сокет(как масив байтов). А на другой плотформе( куда мы &lt;br&gt;&amp;gt;передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому &lt;br&gt;&amp;gt;при работе с полученым массивом байтов как со структурой test может &lt;br&gt;&amp;gt;получится колизия. ???&lt;br&gt;&lt;br&gt;Может получиться что угодно. На разных платформах могут быть совершенно разные размеры int, char, разные правила выравнивания и разный порядок байт (little/big endian). Поэтому для бинарных протоколов надо использовать типы с фиксированным размером (u)int(8&amp;#124;16&amp;#124;32)_t, hton* и ntoh* функции для преобразования порядка байт (man ntohs) и упакованные структуры.&lt;br&gt;&lt;br&gt;&amp;gt;И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp &lt;br&gt;&amp;gt;или icq? эти протоколы тоже должны (наверное) передавать структуры по сети &lt;br&gt;&amp;gt;между раз</description>
</item>

<item>
    <title>Передача структур через сокеты UNIX (GreenHouse)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#5</link>
    <pubDate>Mon, 30 Nov 2009 08:55:34 GMT</pubDate>
    <description>Спасибо за подсказку, сейчас буду с этим разбиратся.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Передача структур через сокеты UNIX (ACCA)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#4</link>
    <pubDate>Sun, 29 Nov 2009 22:40:35 GMT</pubDate>
    <description>&amp;gt;Именно при  помощи этой книги я и разбирался с сетевым програмированием. &lt;br&gt;&amp;gt;Но интересующая меня тема затрогута слабо. Хотя возможно я что то &lt;br&gt;&amp;gt;пропостил. &lt;br&gt;&lt;br&gt;Я бы сказал - очень существенную часть пропустил.&lt;br&gt;&lt;br&gt;Во-первых размер int может быть от 16 бит и больше. Во-вторых есть такая весёлая штука как big или little endian. В-третьих атрибуты (поля) структуры могут дополняться до полного машинного слова, а то и до страницы памяти (называется alignment), это определяется ключами и директивами компилятора.&lt;br&gt;&lt;br&gt;Совершенно не гарантируется, что на принимающей стороне представление структуры в памяти совпадёт с представлением отправителя.&lt;br&gt;&lt;br&gt;То, что ты хочешь сделать, называется сериализация - преобразование структуры в последовательный поток байтов и обратно. В общем случае достаточно сложная задача. Лучше не изобретай велосипед, а найди подходящую готовую библиотеку. Есть модная штука под называнием JSON. Посмотри, что это такое. Можно и XML гонять, собственно libxml в Linux на большее не годится.&lt;br&gt;&lt;br&gt;Всякие RPC,</description>
</item>

<item>
    <title>Передача структур через сокеты UNIX (OnlySlon)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#3</link>
    <pubDate>Sun, 29 Nov 2009 15:57:29 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&#125;; &lt;br&gt;&amp;gt;Эта структура весит 6 байт на моей платформе, я передаю её по &lt;br&gt;&amp;gt;сети через сокет(как масив байтов). А на другой плотформе( куда мы &lt;br&gt;&amp;gt;передаем нашу структуру) разделитель между полями структуры 2 байта. И поэтому &lt;br&gt;&amp;gt;при работе с полученым массивом байтов как со структурой test может &lt;br&gt;&amp;gt;получится колизия. ??? &lt;br&gt;&amp;gt;И ещё такой вопрос как работают протоколы основаные на tcp/ip например ftp &lt;br&gt;&amp;gt;или icq? эти протоколы тоже должны (наверное) передавать структуры по сети &lt;br&gt;&amp;gt;между разными платформами. Как они заботятся о том что эти структуры &lt;br&gt;&amp;gt;будут иметь одинаковый размер на всех платформах? &lt;br&gt;&lt;br&gt;#pragma pack() тебе в помосч&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Передача структур через сокеты UNIX (GreenHouse)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#2</link>
    <pubDate>Sun, 29 Nov 2009 15:43:37 GMT</pubDate>
    <description>&amp;gt;&amp;gt;Программирую на С++ под os Linux уже второй день&lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;UNIX Разработка сетевых приложений. Автор Стивенс и компания. Издание как минимум 3е. &lt;br&gt;&amp;gt;Вам очень нужна эта книга &lt;br&gt;&lt;br&gt;Именно при  помощи этой книги я и разбирался с сетевым програмированием. Но интересующая меня тема затрогута слабо. Хотя возможно я что то пропостил. &lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Передача структур через сокеты UNIX (TyLLIKAH)</title>
    <link>https://mobile.opennet.me/openforum/vsluhforumID9/8526.html#1</link>
    <pubDate>Sun, 29 Nov 2009 13:36:36 GMT</pubDate>
    <description>&amp;gt;Программирую на С++ под os Linux уже второй день&lt;br&gt;&lt;br&gt;UNIX Разработка сетевых приложений. Автор Стивенс и компания. Издание как минимум 3е. Вам очень нужна эта книга&lt;br&gt;</description>
</item>

</channel>
</rss>
