-
Дмитрий Артюховский, расскажите пожалуйста про конечный результат - оно работает? Я сейчас пытаюсь сделать нечто подобное через модем, но пока успехи невелики. В данном примере меня смущают не мелкие погрешности (уже привык
), а то, что SysLibSocket работает не так, как того ожидаешь (у Овна вообще все библиотеки с "национальными особенностями" - классический пример SysLibTime - вместо добавления доп. ф-ции SetTime сделали сами знаете что).
Сокеты вообще-то работают так (в POSIX системах, т.е. в UNIX/Linux, откуда они родом, а также в Windows, где они скопированы "1 в 1"):
socket();
bind(); Задаем IP-адрес (редко) и порт (всегда).
listen(); Задаем ограничение на число соединений, ожидаем соединения.
accept(); Создается дубликат сокета, однако они не равноценны - дубликат уже соединен (ESTABLISHED), а исходный сокет ждет следующего соединения (LISTEN).
Теперь дубликат используется для обмена данными - read()/write()/send()/recv() и затем соединение закрывается - сlose(). Для распараллеливания это обычно делается в дочернем процессе или thread. А основная программа возвращается к listen().
У Овена сразу создается несколько сокетов, слушающих один порт (в других реализациях это ошибка!). Что делает listen() - непонятно, но он не сообщает о поступившем соединении. А accept(), похоже, вообще нет. В результате о том, что соединение установлено, можно узнать только по возврату recv(). Также, по тексту примера, соединение и не закрывается. Как сокет возвращается вновь в состояние LISTEN? По таймауту? По закрытию клиентом? А если он не закроет (может для этого и 3 сокета)? У меня по Ethernet вроде работает, но иногда выдает ахинею, как будто склеиваются несколько ответов, может как раз из-за нечеткой фиксации конца транзакции?
Также, на мой взгляд, пример расточителен по ресурсам процессора. Зачем повсюду искать "спецтег" <OWEN> для подстановки переменных - это же ПЛК, а не ПК (как любит говорить техподдержка
). Постоянно перезагружать страницу для обновления все равно неразумно - для этого есть AJAX. Также странно реализована SymLib - если бы вместо ф-ций Read/Write можно было бы получить адрес по имени, то a) это можно было бы делать один раз и б) легко можно было бы передать массив (а сейчас только по элементам?).
Ваши права
- Вы не можете создавать новые темы
- Вы не можете отвечать в темах
- Вы не можете прикреплять вложения
- Вы не можете редактировать свои сообщения
-
Правила форума