Имеются два соединенных сокета. Следовательно, можно посылать и принимать
данные, используя обычные функции write/read.
Правильно ли я понимаю, что поскольку у read и write указатель на данные
имеет тип void *, то можно посылать структуры, например, такие:
struct msg {int a, int b}, размера sizeof(struct msg) ?
Если так, то существует ли какой-нибудь способ посылки структур типа:
struct msg {int a, char *b}, где b указывает на строку?
Какой задавать размер буфера? Что, если он будет такой:
sizeof(struct msg) + strlen(b) ?
Могут. Зависит от кривизны рук. Но лучше с этим не связываться. Если структуры данных довольно сложные и они будут меняться в будущем, то лучше сериализовать в seхps или хml.
как уже неоднократно говорилось, к структурам может применяться выравнивание. И лучше всего НИКОГДА не записывать объекты структур куда-либо, в файл или в сокет, без разницы.
> как уже неоднократно говорилось, к структурам может применяться выравнивание. И лучше всего НИКОГДА не записывать объекты структур куда-либо, в файл или в сокет, без разницы.
жаль, что авторы 99% сетевых протоколов, RDBMS и пр. и пр. не в курсе этого правила.
можно. в структуре должно указать смещение строки от начала пакета. для правильной передачи/приёма полей типа short/int итд есть ntoh/hton - функции. лучше всего написать группу макросов для записи/чтеничя полей структуры, чтоб не зависеть от #pragma pack, которая зависит от настроек компилятора или архитектуры.
тех, которые утверждают, что по сети надо передавать xml надо расстреливать. передавайте, передавайте аудио/видеопоток в xml, ага. Пакеты в квейке и тп тоже давайте в xml. Вы ещё письмо разработчикам анрил напишите, они-то, дураки, не знают, как надо структуры по сети передавать.
> тех, которые утверждают, что по сети надо передавать xml надо расстреливать.
А как взаимодействовать двум ИС двух разных компаний? Писать свои протоколы на коленке, ходить потом разбираться, какого они шлют не тот порядок байтов, или в этом corner case-е переполнение, или формат даты не такой. Вы представляете, сколько времени и нервов это займёт? А с XML-ем всё просто, нарисовали схему, подписали и готово. XML-парсеры/серализаторы есть для всего, что движется; по схеме проверять тоже почти всё умеет, если что то где то косячит, сразу видно.
> тех, которые утверждают, что по сети надо передавать xml надо расстреливать. передавайте, передавайте аудио/видеопоток в xml,
Где я говорил, что аудио/видео поток нужно передавать используя ХML? Не надо выдирать фразы из контекста и применять их к своему больному воображению. Для этого всегда нужно использовать UDP/RTP потому как потерями/ошибками можно пренебречь. А где нужна надежность и стабильность, то да, сериализовать и слать в ХML, seхps.
> Для этого всегда нужно использовать UDP/RTP потому как потерями/ошибками можно пренебречь.
ну а структуры туда тоже надо как-то заворачивать, если будешь в тупую делать write(my_struct...)/read(my_struct) то работать это будет только на машинах с одинаковыми архитектурами и компиляторами
>меются два соединенных сокета. Следовательно, можно посылать и принимать данные, используя обычные функции write/read.
>Правильно ли я понимаю, что поскольку у read и write указатель на данные имеет тип void *, то можно посылать структуры, например, такие:
struct msg {int a, int b}, размера sizeof(struct msg) ?
понял ты то правильно, вот только ты не представляеш как это принимать за пределами пославшей машины...
>Если так, то существует ли какой-нибудь способ посылки структур типа:
struct msg {int a, char *b}, где b указывает на строку?
"какой нибуть" - существует.
>Какой задавать размер буфера?
sizeof(struct msg)
>Что, если он будет такой:
>sizeof(struct msg) + strlen(b) ?
ничего хорошего не будет. А вообщето тебе надо еще С подучить;)
>ничего хорошего не будет. А вообщето тебе надо еще С подучить;)
Ты лучше бы сказал, как передавать структуру, на которую ссылается
указатель другой структуры, о чем и был вопрос, если ты такой умный.
read и write в качестве третьего аргумента принимают значение буфера
в байтах, strlen как раз и выдает размер строки в байтах. Я построил
интуитивную аналогию.