Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > ПЛК и микроконтроллеры
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Неблокирующий сокет при обмене по сети с I7188EX

 Ответить Ответить
Автор
Сообщение
Hobo007 Смотреть выпадающим
Новичок
Новичок


Присоединился: 02 Июль 2009
Категория: Russian Federation
Online Status: Offline
Публикации: 18
Свойства публикации Свойства публикации   Ответить, цитируя автора - Hobo007 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Неблокирующий сокет при обмене по сети с I7188EX
    Опубликовано: 01 Август 2009 17:02

Кто-нибудь знает, как сделать неблокирующий сокет при обмене по сети с I7188EX?

Функция selectsocket ждет запроса, и пока он не придет, все висит. 

Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 11:11

Кардинальное решение - использовать UDP вместо TCP

С уважением, SAN

Наверх
Hobo007 Смотреть выпадающим
Новичок
Новичок


Присоединился: 02 Июль 2009
Категория: Russian Federation
Online Status: Offline
Публикации: 18
Свойства публикации Свойства публикации   Ответить, цитируя автора - Hobo007 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 12:31

Имеет значение гарантированная доставка и порядок запросов, чтобы не надо было все это самому отслеживать.

Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 13:22

Вопрос - где и какая надежность нужна

Надежность TCP означает следующее :  2-й, 45-й, 3 .. 6-й пакеты пришли через Австралию, 1-й, 10 .. 44-й - через Голландию, 7-й и 16..18-й опять из Австралии но с где-то застряли и задержались на 10 минут ... и т.д..
Так вот, TCP пытается собрать и расставить по порядку такие пакеты (но не гарантирует !)

В пределах локальной сети UDP обладает всей необходимой надежностью, даже лучше чем ... TCP (!), так-как не застревает по каждому поводу.

Выбирайте

С уважением, SAN

Наверх
Hobo007 Смотреть выпадающим
Новичок
Новичок


Присоединился: 02 Июль 2009
Категория: Russian Federation
Online Status: Offline
Публикации: 18
Свойства публикации Свойства публикации   Ответить, цитируя автора - Hobo007 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 15:24

Решил, что невежливо оставлять ваш ответ без ответа.

Сеть, конечно, локальная. И я не думаю, что наши маршрутизаторы гоняют пакеты через Австралию, если машина (или контроллер) прописаны в локальной сети.

С UDP у меня не получилось добиться правильной очередности получения пакетов. Не знаю какие здесь нюансы, ведь даже связь осуществлялась напрямую ПК - I7188EX. Поэтому решил сделать на TCP. По крайней мере проблемы очередности не будет.

Конечно, здесь свои нюансы. Вот я и разбираюсь.

Вопрос то был, как сделать неблокирующий сокет при обмене по сети с I7188EX?

Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 16:09
может тут поможет : http://forum.skunksworks.net/Forum10/HTML/000401.html

а вообще сокет можно открыть в неблокирующем режиме (по крайней мере в *.nix) ... может есть что-то подобное и в MiniOS7 ...
Наверх
kuzulis Смотреть выпадающим
Участник
Участник


Присоединился: 04 Декабрь 2008
Категория: Russian Federation
Online Status: Offline
Публикации: 81
Свойства публикации Свойства публикации   Ответить, цитируя автора - kuzulis Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 16:10
и обычно задается параметр ожидания байт ... может у вас установлено в бесконечности ? :)
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2009 16:51

А где серверный сокет - в I7188EX или на ПК  ?

Лучше, если сервер на более мощной стороне, т-е на ПК. Тут больше возможностей организовать асинхронные сокетные функций по событиям, или же синхронные с открытием потоков.  Но это смотря какая ОС стоит  ?

С уважением, SAN

Наверх
Hobo007 Смотреть выпадающим
Новичок
Новичок


Присоединился: 02 Июль 2009
Категория: Russian Federation
Online Status: Offline
Публикации: 18
Свойства публикации Свойства публикации   Ответить, цитируя автора - Hobo007 Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Август 2009 08:57

Всем спасибо за помощь.

Моя ошибка была в том, что не использовал структуру timeval для задания времени ожидания, просто тупо скопировал из примера:

    rc = selectsocket( SOCKETS, &rfds, NULL, NULL, NULL );
Значение NULL для тайма-ута задает бесконечный опрос сокетов, и пока не появится клиент функция не возвращает управление.

Если же сделать 0-й тайм-уат, то управление возвращается сразу, если нет клиентов.

Правда, теперь у меня появился следующий вопрос. Сервер мне нужен на I7188EX, а клиенты будут с ПК получать от него нужные данные. Конечно же я задал максимальное количество подключаемых сокетов, для которых создал таблицу состояний. Процедура инициализации сети запускается при включении контроллера, поэтому дескриптор слушающего сокета всегда =0. А вот при подключении клиентов назначаемые им дескрипторы могут быть больше максимального количества клиентов. Проблема в том, что когда обнаружен новый клиент, а все клиентские сокеты уже заняты, нигде не делается проверки дескриптора и делается запись в таблицу состояния сокета в недупустимую область памяти. По крайней мере в тех примерах что я нашел такого нигде не делается. В принципе эти примеры работают, так как такие клиенты все равно ответ не получат, но есть потенциальная опасность, что будут затираться данные в памяти.

Кто-нибудь решал такую проблему?

 

Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz