Да отправляется чаще .Просто не получилось
Друзья, может подскажете, как вы справлялись с сокетами, если, конечно, это для вас не секретная информация. Какое время цикла ставите, чтение\запись делаете в одном цикле, после каждой транзакции закрываете сокеты или это зависит от ПЛК? На ПЛК154 получается читать и писать в одном цикле, если SysSockCreate() возвращает 2, если 1, то читает сокет через раз, как будто сокет создался в блокирующем режиме, хотя это не так.
У меня на ПЛК 110 new и ПЛК 100 МинВЦ = 0 и прекрасно и максимально быстро работает.
В разных.
При работе с HTTP закрываю сокет после каждой транзакции. С собственным протоколом работаю при постоянно открытом соединении.
Я думаю что не стоит писать и читать в одном цикле. По сокетам есть очень полезное видео, правда для CDS V3, но суть одна.
Напильник, велосипед, бубен, грабли и костыли - основные инструменты программиста.
Сокеты не закрываю, точнее, закрываю если сокет "сервер" и к нему нет обращений какое то время (так определяю обрыв связи) чтобы в следующем цикле открыть снова. Клиенты бомбят без остановки но за цикл либо пишу либо читаю, причем если сокетов открыто много то читаю/пишу только одним сокетом, на следующем цикле другим итд. Если прием/передача проходят с ошибкой клиента закрываю чтобы открыть в следующем цикле.
С серверами сложнее. В одном цикле перебираю все фунцией чтения, если с какого есть данные(запрос) - перебор прекращаю на следующем цикле если нужно ответить отвечаю и(или) продолжаю перебор оставшихся сокетов. И так по кругу.
вощемто работает )
Спасибо за ответы! Разделил чтение\отправку, чередую в цикле. Проблема только в том, что не всегда могу получить данные, повторюсь, если если SysSockCreate() возвращает 1, если 2, то сколько бы я с сервера ни отправлял, все доходит...
Есть у меня подозрение... )
Насчет дискрипторов... У меня сокеты открываюцо с дискрипторами 1,2,3...15. Первый всегда создается с дискриптором 1. (если у вас первый с двойкой смотрите код внимательнее возможно их открываецо два и отсюда все траблы)
открываем:
IF m_dnSocket = SOCKET_INVALID THEN
m_dnSocket := SysSockCreate( ... );
END_IF
А вот с закрытием сложнее...
o_dnRes := BOOL_TO_INT( SysSockClose ( m_dnSocket ) );
для 110-го:
IF o_dnRes = 0 THEN
m_dnSocket := SOCKET_INVALID;
END_IF
причем в какой-то прошивке SysSockClose возвращал правильное значение но реально сокет не закрывался. (значит следующий отрывался с дискриптором на еденичку больше)
для 100-го:
IF o_dnRes = 1 THEN
m_dnSocket := SOCKET_INVALID;
END_IF
по моему как то так. кто сможет опровергните )
У меня открывается или с дескриптором 1 или 2, других пока не наблюдал, проверю вариант с незакрытием сокета. Просто, по логике вещей, если у меня открыто два сокета, то траблов как раз таки нет...
Итак, при запуске должен открываться сокет с handle=1, 0-й занят средой CoDeSys.
Если при открытии 1 сокета handle=2 - что-то тут не так.
Учтите, что listen->accept позвращает тот-же handle, т.е. как в винде нельзя поступать - открыть сокет, поставить в listen и плодить сокеты по приходящим соединениям.
1 сокет - 1 и только 1 соединение.
Тролль-наседка, добрый, нежный и ласковый