PDA

Просмотр полной версии : SysLibSockets



mettled
17.09.2007, 14:40
Вопрос возник небольшой о функциях этой библиотеки. Скачал я пример Веб - Сервера. Он работает, но если разбираться дальше. Очень странно как то.
для того что бы соккет работал, нужно его создать(SysSockCreate), установить соединение(SysSockConnect),связать его с локальным адресом(SysSockBind),ну и можно вызвать функцию(SysSockIoctl), для управления режимом I/O сокета.
Из всех вышеописанных функций работаю только 2 : SysSockCreate и SysSockBind. Хотелось бы узнать почему остальные не работают.
Еще такой вопросик ...
по работе веб сервера получается что он считывает хтмл файл c контролелра в буфер, затем перебирая по символу содержимое буфера находит переменные и заменяет их значениями из символного файла. И потом выдаёт на отправку. Но здесь есть небольшоя проблемма, иногда происходит изменение кода хтмп файлов, такое чувство что открывает их и на чтение и на запись, хотя в коде сервера написано что открытие происходит только на чтение.Соотвественно вопрос , поясните как это он может менять код файлов?? Может я чего не понимаю .. или не знаю )) так скажите где почитать и разобраться во всем )

Филоненко Владислав
17.09.2007, 15:38
1. SysSockIoctl - работает, но как вы хотите увидеть работу блокирующего режима?
2. SysSockConnect - тоже.

С изменением html -как это выражается?

mettled
17.09.2007, 16:26
Тогда буду благодарен если вы укажете ошибку в данном куске кода.
если все работает, то переменное temp и temp1 должны принимать значение TRUE, а переменная temp2 , должна принимать значение 0 при ошибке, и 1 при правильном функционировании(если я все правильно понял). Однако происходит все наоборот.
socket:=SysSockCreate(SOCKET_AF_INET,SOCKET_STREAM ,SOCKET_IPPROTO_TCP);
tcp_adr.sin_family:=SOCKET_AF_INET; tcp_adr.sin_port:=80;
tcp_adr.sin_addr:=SOCKET_INADDR_ANY;
temp:=SysSockConnect(socket,paddr,SIZEOF(tcp_adr)) ;
paddr:=ADR(tcp_adr);
res:=SysSockBind(socket,paddr,SIZEOF(tcp_adr));
temp1:=SysSockListen(socket,1);
paddr:=ADR(accept_adr);
param_ctrl:=1;
temp2:=SysSockIoctl(socket,SOCKET_FIONBIO,ADR(para m_ctrl));
status:=1;

Насчет хтмл, да просто заливаю страничку на контроллер , и в один прекрасный момент обнаруживаю, что в файле появляются дополнительные строчки. хотя их там не должно быть. Поставил очистку буффера до считывания файла и после того как он отправлен на соккет, кажется эта проблемма исчезла. Но просто интерсно как такое может быть, если мы строчкой:
file_descriptor:=SysFileOpen(file_name,'r');
открываем файл только на чтение... и сразу после этого его закрываем.

Малышев Олег
18.09.2007, 10:46
Есть предположение, что это связано с фрагментацией памяти (SysLibMem), если у вас страницы (с учетом вставки тегов) меньше 65535 лучше выделить статический байтовый массив.

В данном фрагменте кода не совсем понятно зачем Вы вызываете Connect? Тип сокета - серверный - т.е. он должен получать запросы.

Что будет если "открываем файл только на чтение... и сразу после этого его закрываем". Укажите Ваш контроллер, таргет и прошивку.

mettled
18.09.2007, 11:24
да понятно что connect здесь не нужен, просто хотел сказать, что эти функции не работают. Функция listern в вашем примере не возвращает TRUE. А так как соккет у нас потоковый , а не дейтограммный, то функция эта должна быть и должна работать и возвращать TRUE.
Насчет контроллера - ПЛК 150, прошивка - 2.01.8., таргет - 2.0-4.

mettled
18.09.2007, 11:35
кстати насчет SysSockIoctl, в хелпе небольшая ошибка есть в описании, цитирую:
SysSockIoctl
Функция (из библиотеки SysLibSockets.lib) типа DINT, вызывает функцию ioctl операционной системы, для управления режимом I/O сокета. Возвращает TRUE при успешном окончании, иначе FALSE.
__________________________________________________ ___
Как это она может восвращать TRUE или FALSE, если тип функции DINT)))
насколько я понимаю TRUE = 1 , а FALSE = 0???
Она всегда возвращает 0, потму она не работет.

И вообще зачем эта функция здесь ? Если и без нее прекрасно все работает ?

mettled
18.09.2007, 11:46
это насчет хтмл, вот что получается иногда:
http://213.184.244.164/table2.html.
то что пишет мелким шрифром, того не было в начальном коде хтмл, это появилось потом.

Филоненко Владислав
18.09.2007, 11:49
Это наша недоработка, в библиотеке CodeSys функция возвращает 0/1, а у нас (-1) или номер сокета. А так она полностью работоспособна

mettled
18.09.2007, 11:51
т.е. если возвращает -1 то она сработала ? а если ноль то она не сработала ?

Филоненко Владислав
18.09.2007, 12:00
т.е. если возвращает -1 то она сработала ? а если ноль то она не сработала ?

-1 и меньше - ошибка, 0 и больше - все нормально. Возвращаемый аргумент 32 битовый со знаком

mettled
18.09.2007, 13:08
а что насчет функции listern???(см.выше)

Филоненко Владислав
18.09.2007, 15:45
А мы о чём разговаривали???

mettled
18.09.2007, 16:25
народ, вы что прикалываетесь ??!?
вы мне написали о значениях функции SysSockIoctl!!!
а теперь я хотел бы узнаить о функции listern, цитирую свой вопрос:

".........................Функция listern в вашем примере не возвращает TRUE. А так как соккет у нас потоковый , а не дейтограммный, то функция эта должна быть и должна работать и возвращать TRUE."

Филоненко Владислав
18.09.2007, 18:25
А я говорил о listen. Прикольно...
Хотя и SysSockIoct Это касалось.

mettled
18.09.2007, 18:33
Владислав, по вашим словам функция SysSockListen, должна - "Возвращать аргумент 32 битовый со знаком"??? как такое мoжеть быть??? если она типа BOOL. Может быть вы не поняли моего вопроса, но мне кажется я достаточно ясно все написал, прошу вас прочитайте еще раз все сообщения...

Филоненко Владислав
19.09.2007, 10:00
Обьясню еще раз. Когда мы писали стек TCP, то все функции имели расширенный ответ - коды ошибок с отрицательным знаком, а 0 и более - положительный ответ.
В библиотеке иной метод возвращение сообщения об ошибке (TRUE/FALSE).
В результате функции неправильно возвращают ответ. В ближайшей прошивке эту ошибку мы исправим.

Анонимус
11.05.2010, 22:30
Подскажите пожалуйста, почему
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
Возвращает значение -1?
Библиотеку подключил, а сокет не создается...

Филоненко Владислав
13.05.2010, 17:02
проект в студию

capzap
26.06.2011, 10:22
Анализируя ответ функций чтения/записи и код посл. ошибки Вы и можете определить, есть соединение или нет.
Такой подход гарантирует, что вне зависимости от числа входящих соединений у Вас всегда для каждого требуемого сервиса будет нужное число сокетов.
Я, чесно говоря, запутался при осмыслении работы библиотеки. Так все же "одно соединение - один сокет" или я не забочусь о создании сокетов, один раз создал, а клиент при подключении получает свой сокет автоматически

S.A.D.
08.04.2013, 18:32
Подскажите пожалуйста, почему
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
Возвращает значение -1?
Библиотеку подключил, а сокет не создается...

Аналогичная ситуация. Использую ПЛК100
понимаю что тема давнишняя, но вдруг кто отпишется...

capzap
08.04.2013, 20:17
Аналогичная ситуация. Использую ПЛК100
понимаю что тема давнишняя, но вдруг кто отпишется...

http://www.owen.ru/forum/attachment.php?attachmentid=6210&d=1338268380 пауза поможет рассмотреть код поближе :)

S.A.D.
09.04.2013, 10:29
http://www.owen.ru/forum/attachment.php?attachmentid=6210&d=1338268380 пауза поможет рассмотреть код поближе :)
чудеса какие-то)) у вас та же самая функция с текстом один в один TcpServerOpenSocket открывает сокет и возвращает дискриптор 1, а у меня нифига. Ставлю точку останова сразу после этой функции и вижу что итог её работы -1 в дискрипторе.
прикрепляю файл проекта

capzap
09.04.2013, 12:23
чудеса какие-то)) у вас та же самая функция с текстом один в один TcpServerOpenSocket открывает сокет и возвращает дискриптор 1, а у меня нифига. Ставлю точку останова сразу после этой функции и вижу что итог её работы -1 в дискрипторе.
прикрепляю файл проекта

Значит берете и сбрасываете плк, видимо больше 15 раз открывали сокет, притом корректно не закрывая его, отсюда и проблемы

S.A.D.
09.04.2013, 12:51
черт побери разобрался кажется. Взял сделал проект куда вынес только функцию открытия сокета сервера и стал построчно выполнять код. И выяснилось что в нижеприведенном тексте функция SysSockListen возвращает false и дискриптор выставляется в -1.
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
IF diSocket <> SOCKET_INVALID THEN
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(iPort);
bResult:=SysSockBind(diSocket, ADR(sa), SIZEOF(sa));
IF bResult = FALSE THEN
diSocket:=SOCKET_INVALID;
ELSE
bResult:=SysSockListen(diSocket, diMaxConnections);
IF bResult = FALSE THEN
diSocket:=SOCKET_INVALID;
END_IF
END_IF
END_IF
TcpServerOpenSocket:=diSocket;

помнится где-то на форуме я встречал, что эта функция с багом и нужно возвращаемое ей значение просто игнорировать. Я прав?

ЗЫ: хотя, у вас то работает... Текст ф-ии открытия сокета один и тот же.

S.A.D.
09.04.2013, 13:18
все оказалось верно. как только я забил на значение которое возвращает syssocklisten сразу все заработало и я был рад лицезреть в приемном буфере modbus кадры от лектуса))

vishwa
07.11.2013, 17:06
Hai.. SAD,, I am getting same thing.. socket is not at all created its returning -1..
How you made it to run please.. explain

vishwa
08.11.2013, 16:39
http://www.owen.ru/forum/attachment.php?attachmentid=6210&d=1338268380 пауза поможет рассмотреть код поближе :)

hai sir,,

I am able to create the both client socket and server socket but its not binding , and i am bit confused in communication parameters.. i am very new to codesys.. and i am a student.. plese guide me..

КучаВопросов
19.01.2014, 21:02
Не стану плодить темы.Задам вопрос здесь. Пытаюсь разобраться с SysLibSockets.За основу взял пример capzap (видеопример).В примере как я понял создаются сервер и клиент на одном ПЛК. У меня тоже создается сокет сервера и сокет клиента, но SysSockRecv постоянно в -1. Что я делаю не так???И еще хотел бы задать вопрос, возможно с помощью этой биб-ки связать ПЛК и MasterOPC UniversalModbusServer? В частности мне не понятно как быть в таких случаях с адресацией(((

capzap
19.01.2014, 21:12
кроме сокетов, необходимо реализовать мастер либо слейв протокола модбас
а по поводу почему прием всегда пуст, мое видео сделано на одном плк, комп выступал в качестве шлюза меняя порты

КучаВопросов
19.01.2014, 21:50
[QUOTE=capzap;128422]кроме сокетов, необходимо реализовать мастер либо слейв протокола модбас
это в конфигурации необходимо реализовывать?
[QUOTE=capzap;128422]а по поводу почему прием всегда пуст, мое видео сделано на одном плк, комп выступал в качестве шлюза меняя порты
я тож делал на одном плк. Но почему -то не получалось(

capzap
19.01.2014, 21:57
выложенный тут (http://www.owen.ru/forum/showthread.php?t=14056&p=126715&viewfull=1#post126715) пример работает?

КучаВопросов
19.01.2014, 22:11
выложенный тут (http://www.owen.ru/forum/showthread.php?t=14056&p=126715&viewfull=1#post126715) пример работает?

хорощо попробую

КучаВопросов
20.01.2014, 09:33
в браузере указан реальный IP-адрес шлюза
это я как понял надо изменить Gate в ПЛК?

КучаВопросов
20.01.2014, 09:42
выложенный тут (http://www.owen.ru/forum/showthread.php?t=14056&p=126715&viewfull=1#post126715) пример работает?
Попробовал.Работает.

capzap
20.01.2014, 09:45
Значит остается проверить как сделана принимаемая часть,то бишь сервер, за основу можно взять из бибки tcpudplib

КучаВопросов
20.01.2014, 10:22
У меня создается и сервер(номер сокета 1) и клиент(номер сокета 2). Вы говорили что, комп выступал в качестве шлюза меняя порты. Что для этого надо сделать?

capzap
20.01.2014, 15:23
в линуксе достаточно такой команды
while true; do nc -l 503 | nc 192.168.1.88 502; done;слушает свой локальный порт 503 и все что туда приходит отправляет по адресу АйПи такой то порт 502, в винде точно незнаю, наверное и готовые приложения есть