
Oleg
01.06.2018
17:53:30
но спасибо)

Ievgenii
01.06.2018
17:53:46
Вообще, ситуация, когда ты пытаешься читать из сокета без нужды - странная

Oleg
01.06.2018
17:54:14
modbus slave устройство всегда мониторит шину
но у modbus есть вариация с другим физическим уровнем - TCP

Google

Ievgenii
01.06.2018
17:54:54
Попробуй читать из закрытого
Может там будет exception

Oleg
01.06.2018
17:55:16
хорошо, проверю

Ievgenii
01.06.2018
17:55:19
Это не хорошо, но можно на него завезаться

Pavel
01.06.2018
17:56:46
Что-то мне подсказывает что в TCP протоколе вообще все плохо с отключением

Ievgenii
01.06.2018
17:56:55
К стати, как вы компилите? Я вот пробовал в докере - удобно. Даже dmd не ставил)

Pavel
01.06.2018
17:57:16
Ты никак не можешь понять произошло ли оно

Ievgenii
01.06.2018
17:57:33
Ну есть нюансы
До 5 минут может "обманывать"
Но если это постоянное соединение - пинги спасут

Oleg
01.06.2018
17:58:32

Google

Oleg
01.06.2018
17:59:09
а может так случиться, что клиент "зайдёт под другим именем"?

Ievgenii
01.06.2018
17:59:25

Pavel
01.06.2018
17:59:39
Мне в докере неудобно, во-первых dub кеш каждый раз заново выкачивается, во вторых ни dcd ничего нельзя подключить к редактору

Oleg
01.06.2018
17:59:40
типа из-за плохой связи он не сможет достучаться, и откроет новое соединение, а сервер будет думать что просто тишина

Ievgenii
01.06.2018
18:00:00

Oleg
01.06.2018
18:00:32

Pavel
01.06.2018
18:01:30
Так кеш можно монтировать
Можно, но иногда хочется и компилятор просто так запустить. Справку почитать, в разных режимах собрать бинарник. Если через докер все это делать то указание опций усложняется.
В итоге я все равно вернулся на LXC контейнер

Oleg
01.06.2018
18:02:02
ну может id какой, чтобы по тему принудительно старое рвать если новый с таким же id соединяется?

Pavel
01.06.2018
18:03:33
Да, можешь сделать высокоуровневый id
Чтобы клиент свой id посылал, а у тебя уже будет хешмап, подключен ли такой id

Oleg
01.06.2018
18:03:55

Pavel
01.06.2018
18:04:06
А на уровне TCP это никак не решить, так уж спроектировано.

Oleg
01.06.2018
18:04:31
тоесть modbus чётко регламентирован и добавлять туда свои id будет неправильно (потеряется совместимость с существующим софтом)
вообще может такое быть, что, например я отправил 250 байт с клиента, а серверу (slave'у по TCP) они в рваном формате пришли и я их там читаю по 10-20?
или может вообще с другой стороны обыграть ситуацию: при запросе каждый раз открывать соединение, а на принимающей стороне не хранить сокет с клиентом?
или это совсем дурно?

Google

Pavel
01.06.2018
18:14:25

Maxim
01.06.2018
18:31:56
https://theartofmachinery.com/2018/05/27/cpp_classes_in_betterc.html — надо будет на досуге разобраться и поиграться с этим)

Oleg
01.06.2018
18:37:05
Может
а где-то можно почитать про размер неразрывных пакетов? сколько байт точно будут одним скопом идти

Pavel
01.06.2018
18:38:16
Не знаю.. думаю что зависит от размера буфера сетевой карты, операционной системы, настроек сети.. MTU там какие-нибудь
TCP может окно сужать и расширять чтобы посылать больше/меньше данных
Но 1 байт я думаю это точно неразрывная порция данных )
Так что можешь посылать в первом байте признак начала данных, потом еще 2-3 байта на длину данных, а потом уже понимать сколько данных ты ждешь.

Oleg
01.06.2018
18:40:53
только длину могу

Pavel
01.06.2018
18:41:16
А сколько она байт?

Oleg
01.06.2018
18:41:24
вернее длину посылаю по протоколу modbus tcp
весь adu
pdu для rtu и tcp одинаковый и где-то 240 байт, кажется
pdu - полезная нагрузка по сути
adu = pdu + служебная информация

Pavel
01.06.2018
18:53:13

Dark
01.06.2018
19:06:08

Ievgenii
01.06.2018
19:14:17
То можно сделать так:

Google

Ievgenii
01.06.2018
19:14:53
При любом новом соединении просто закрывай старое и бери в работу новое соединение
Если это не что-то публичное!
Иначе будет проблема с безопасностью и логически будет не верно

Oleg
01.06.2018
19:15:52
не принято так делать, понял

Ievgenii
01.06.2018
19:16:26
Ну любое новое соединение тебя отрубает от сервака
Это не верно
Но если это исключительно внутренее - то никто кроме тебя это сделать не может
То так прокатит

Denis
02.06.2018
02:58:43

Oleg
02.06.2018
09:37:30

Ievgenii
02.06.2018
10:29:02
Я бы на это не рассчитывал
Клиент сам может слать по 20 байт
Или 37

qwerty
02.06.2018
10:34:14
есть метод для конкатенации ассоциативных массивов?

Oleg
02.06.2018
11:35:26

qwerty
02.06.2018
11:36:16
Да я так и понял уже

Google

Ievgenii
02.06.2018
11:36:47
Если клиент отослал 15 байт
И через 0.3 сек. шлёт ещё 7 байт
До сервера так и дойдет
Нужно основываться на то, сколько пришло, а не на то, сколько может прийти

Oleg
02.06.2018
11:39:25
если они в пределах mtu

Ievgenii
02.06.2018
11:39:44
Нет
Не режет

Oleg
02.06.2018
11:41:35
надо почитать про modbus tcp, мне кажется там положено один запросов в один send запаковывать

Pavel
02.06.2018
11:43:26

Oleg
02.06.2018
11:43:55
в rtu там вообще по стандарту 3.5 байта времени если между байтами приходит, то это разные пакеты

Pavel
02.06.2018
11:46:41
беда...
Хотя с другой стороны пакет может собираться на получателе в изначально требуемую длину. Надо в общем таненбаума перечитывать

Ievgenii
02.06.2018
11:47:33
А что ты там такое пишешь?

Oleg
02.06.2018
11:49:27
3.5 времени передачи одного байта
в зависимости от скорости передачи

Ievgenii
02.06.2018
11:53:54
Я не шарю что это такое)
Зачем применяется?