LINUX.ORG.RU

Socket


0

0

Посоветуйте литературу и примеры программирования сокетов, с multithread. Есть несколько дурных вопросов. К примеру сервер посылает данные клиенту. Как именно лучше всего сказать клиенту что данные закончились, и их нужно обрабатывать? Я сейчас передаю в певых двух байтах данных, длинну всего пакета. И мне кажется что я не прав.

>И мне кажется что я не прав.

прав. это лучший способ, если данные разношерстые. Если ты точно знаешь что 0x00 (к примеру) никогда не появится в потоке, можно использовать в качестве конца потока (но это груз и чревато неэффективным использованием памяти (реаллоки всякие, буфера больше чем надо и т.п.).

k0l0b0k ★★
()

> Я сейчас передаю в певых двух байтах данных, длинну всего пакета. И мне кажется что я не прав.

Нормально, если уверен, что двух байт хватит и позаботился о порядке этих двух байт.

const86 ★★★★★
()

нормально. Тут всёго два варианта: или вначале передавать длину пакета или делать маркер конца.

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

Ок,

1.если я через setsockopt поставлю SO_RCVLOWAIT в 2, могу ли я быть увереным что один байт не придет?


2. Кто-то пример установки таймаута дать?


ЗЫ, у меня чего-то обмен затыкается, хотя судя по top -H, нити которые с сетью работают, какие-то смешные проценты процессорного времени потребляют.

Artem-Dnepr
() автор топика
Ответ на: комментарий от Artem-Dnepr

> если я через setsockopt поставлю SO_RCVLOWAIT в 2, могу ли я быть увереным что один байт не придет?

Зачем это всё? Если принимающая сторона знает, что должно быть два байта, пусть и ждёт два. Хоть сразу, хоть по одному, порядок-то сохранится.

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

Принимающая сторона, иногда получает -1, и errno в 11. А у передающей стороны продолжает висеть нить, которая ответственная за сокет. Хотя, у передающей стороны выставлен таймаут в 0.5 секунды, и во всех функциях чтения/записи предусмотрена обработка ошибок.
И я не могу понять, кто виноват во всем этом.

Artem-Dnepr
() автор топика

>Посоветуйте литературу и примеры программирования сокетов

Стивенс

yoghurt ★★★★★
()

Если ты заранее не знаешь сколько данных пошлёшь, то маркируй конец данных какимнибудь символом.

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

> если в самих данных содержится этот символ, то чо? )

То этот символ заменяется специальным маркером.

Это все общеизвестно, и вобщем фигня.

Artem-Dnepr
() автор топика
Ответ на: комментарий от acefsm

ну что-то типа \" в строках C - как правило пара символов, обозначающих один (который зарезервирован). В любом случае для протокола это страшный груз.

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

>данные: 1 2 3 4 5 6 0 8 9

>маркер: 0

пусть маркер будет "\n". Сойдёт?

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

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


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

поиск стоп-символа по всем входящим данным, да если еще и с определением стоп-последовательсти с длиной >1 - неприменимо для высокопроизводительных систем, сложнее в реализации, увеличивает объем кода, может увеличить фрагментацию памяти (зависит от реализации). Профит если и есть - то в очень уж частных случаях.

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

> Будет естественно, но я думаю что это не критично(в большинстве случаев)

А если длину передавать, то точно ничего плохого не будет. Но мы не ищем лёгких путей!

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

Это имеет смысл только в случае совпадения следующих условий:

1. типичный объём передаваемой информации -- единицы, максимум десятки, байт

2. в потоке могут быть другие служебные команды

Типичный пример совпадения -- telnet.

kemm
()
Ответ на: комментарий от Artem-Dnepr

Во-первых, это по сути попадает в указанные два пункта. Во-вторых, это не сетевой протокол, ага. Через модем гигабит/с передавать никто никогда не предполагал.

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