LINUX.ORG.RU

Пересылка данных через соединенные сокеты


0

0

Имеются два соединенных сокета. Следовательно, можно посылать и принимать
данные, используя обычные функции 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) ?
★★★★★

учше данные сериализовать в текст и затем посылать. Не будет проблем с byte-oder на различных архитектурах.

anonymous
()
Ответ на: комментарий от ttnl

Могут. Зависит от кривизны рук. Но лучше с этим не связываться. Если структуры данных довольно сложные и они будут меняться в будущем, то лучше сериализовать в seхps или хml.

anonymous
()
Ответ на: комментарий от ttnl

как уже неоднократно говорилось, к структурам может применяться выравнивание. И лучше всего НИКОГДА не записывать объекты структур куда-либо, в файл или в сокет, без разницы.

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

> как уже неоднократно говорилось, к структурам может применяться выравнивание. И лучше всего НИКОГДА не записывать объекты структур куда-либо, в файл или в сокет, без разницы.

жаль, что авторы 99% сетевых протоколов, RDBMS и пр. и пр. не в курсе этого правила.

// wbr

klalafuda ★☆☆
()

можно. в структуре должно указать смещение строки от начала пакета. для правильной передачи/приёма полей типа short/int итд есть ntoh/hton - функции. лучше всего написать группу макросов для записи/чтеничя полей структуры, чтоб не зависеть от #pragma pack, которая зависит от настроек компилятора или архитектуры.

тех, которые утверждают, что по сети надо передавать xml надо расстреливать. передавайте, передавайте аудио/видеопоток в xml, ага. Пакеты в квейке и тп тоже давайте в xml. Вы ещё письмо разработчикам анрил напишите, они-то, дураки, не знают, как надо структуры по сети передавать.

scaldov ★★
()
Ответ на: комментарий от scaldov

> тех, которые утверждают, что по сети надо передавать xml надо расстреливать.

А как взаимодействовать двум ИС двух разных компаний? Писать свои протоколы на коленке, ходить потом разбираться, какого они шлют не тот порядок байтов, или в этом corner case-е переполнение, или формат даты не такой. Вы представляете, сколько времени и нервов это займёт? А с XML-ем всё просто, нарисовали схему, подписали и готово. XML-парсеры/серализаторы есть для всего, что движется; по схеме проверять тоже почти всё умеет, если что то где то косячит, сразу видно.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

> А как взаимодействовать двум ИС двух разных компаний

так, для справки - есть ещё CMIP,ASN1,MIB и прочее..так что не XML`ем единым живут "ИС разных компаний"

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> так что не XML`ем единым живут "ИС разных компаний"

Я этого не утверждал, так же как и не идеализировал XML.

PS Из перечисленного знаю только ASN1 :-( Ушёл учить матчасть.

Legioner ★★★★★
()
Ответ на: комментарий от scaldov

> тех, которые утверждают, что по сети надо передавать xml надо расстреливать. передавайте, передавайте аудио/видеопоток в xml,

Где я говорил, что аудио/видео поток нужно передавать используя ХML? Не надо выдирать фразы из контекста и применять их к своему больному воображению. Для этого всегда нужно использовать UDP/RTP потому как потерями/ошибками можно пренебречь. А где нужна надежность и стабильность, то да, сериализовать и слать в ХML, seхps.

anonymous
()
Ответ на: комментарий от anonymous

> Для этого всегда нужно использовать UDP/RTP потому как потерями/ошибками можно пренебречь.

ну а структуры туда тоже надо как-то заворачивать, если будешь в тупую делать write(my_struct...)/read(my_struct) то работать это будет только на машинах с одинаковыми архитектурами и компиляторами

Reset ★★★★★
()

>меются два соединенных сокета. Следовательно, можно посылать и принимать данные, используя обычные функции 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) ?

ничего хорошего не будет. А вообщето тебе надо еще С подучить;)

cvv ★★★★★
()

>Если так, то существует ли какой-нибудь способ посылки структур типа: struct msg {int a, char *b}, где b указывает на строку?

Обращаю внимание что поле b на приемной стороне не будет иметь какого либо смысла.

cvv ★★★★★
()
Ответ на: комментарий от cvv

>ничего хорошего не будет. А вообщето тебе надо еще С подучить;)

Ты лучше бы сказал, как передавать структуру, на которую ссылается
указатель другой структуры, о чем и был вопрос, если ты такой умный.
read и write в качестве третьего аргумента принимают значение буфера
в байтах, strlen как раз и выдает размер строки в байтах. Я построил
интуитивную аналогию.

Учи C сам.

ttnl ★★★★★
() автор топика
Ответ на: комментарий от cvv

>Обращаю внимание что поле b на приемной стороне не будет иметь какого либо смысла.

Вопрос собственно про это и был.

ttnl ★★★★★
() автор топика

можно делать так:
struct msg{int a, char b[256]};

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

Спасибо за ответ. Спасибо всем.

ttnl ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.