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