Кто-нибудь знает, как сделать неблокирующий сокет при обмене по сети с I7188EX?
Функция selectsocket ждет запроса, и пока он не придет, все висит.
Кардинальное решение - использовать UDP вместо TCP
С уважением, SAN
Имеет значение гарантированная доставка и порядок запросов, чтобы не надо было все это самому отслеживать.
Вопрос - где и какая надежность нужна
Надежность TCP означает следующее : 2-й, 45-й, 3 .. 6-й пакеты пришли через Австралию, 1-й, 10 .. 44-й - через Голландию, 7-й и 16..18-й опять из Австралии но с где-то застряли и задержались на 10 минут ... и т.д.. Так вот, TCP пытается собрать и расставить по порядку такие пакеты (но не гарантирует !)
В пределах локальной сети UDP обладает всей необходимой надежностью, даже лучше чем ... TCP (!), так-как не застревает по каждому поводу.
Выбирайте
С уважением, SAN
Решил, что невежливо оставлять ваш ответ без ответа.
Сеть, конечно, локальная. И я не думаю, что наши маршрутизаторы гоняют пакеты через Австралию, если машина (или контроллер) прописаны в локальной сети.
С UDP у меня не получилось добиться правильной очередности получения пакетов. Не знаю какие здесь нюансы, ведь даже связь осуществлялась напрямую ПК - I7188EX. Поэтому решил сделать на TCP. По крайней мере проблемы очередности не будет.
Конечно, здесь свои нюансы. Вот я и разбираюсь.
Вопрос то был, как сделать неблокирующий сокет при обмене по сети с I7188EX?
может тут поможет : http://forum.skunksworks.net/Forum10/HTML/000401.html
а вообще сокет можно открыть в неблокирующем режиме (по крайней мере в *.nix) ... может есть что-то подобное и в MiniOS7 ...
и обычно задается параметр ожидания байт ... может у вас установлено в бесконечности ? :)
А где серверный сокет - в I7188EX или на ПК ?
Лучше, если сервер на более мощной стороне, т-е на ПК. Тут больше возможностей организовать асинхронные сокетные функций по событиям, или же синхронные с открытием потоков. Но это смотря какая ОС стоит ?
С уважением, SAN
Всем спасибо за помощь.
Моя ошибка была в том, что не использовал структуру timeval для задания времени ожидания, просто тупо скопировал из примера:
rc = selectsocket( SOCKETS, &rfds, NULL, NULL, NULL ); Значение NULL для тайма-ута задает бесконечный опрос сокетов, и пока не появится клиент функция не возвращает управление.
Если же сделать 0-й тайм-уат, то управление возвращается сразу, если нет клиентов.
Правда, теперь у меня появился следующий вопрос. Сервер мне нужен на I7188EX, а клиенты будут с ПК получать от него нужные данные. Конечно же я задал максимальное количество подключаемых сокетов, для которых создал таблицу состояний. Процедура инициализации сети запускается при включении контроллера, поэтому дескриптор слушающего сокета всегда =0. А вот при подключении клиентов назначаемые им дескрипторы могут быть больше максимального количества клиентов. Проблема в том, что когда обнаружен новый клиент, а все клиентские сокеты уже заняты, нигде не делается проверки дескриптора и делается запись в таблицу состояния сокета в недупустимую область памяти. По крайней мере в тех примерах что я нашел такого нигде не делается. В принципе эти примеры работают, так как такие клиенты все равно ответ не получат, но есть потенциальная опасность, что будут затираться данные в памяти.
Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме