Просмотр полной версии : SysLibSockets
Вопрос возник небольшой о функциях этой библиотеки. Скачал я пример Веб - Сервера. Он работает, но если разбираться дальше. Очень странно как то.
для того что бы соккет работал, нужно его создать(SysSockCreate), установить соединение(SysSockConnect),связать его с локальным адресом(SysSockBind),ну и можно вызвать функцию(SysSockIoctl), для управления режимом I/O сокета.
Из всех вышеописанных функций работаю только 2 : SysSockCreate и SysSockBind. Хотелось бы узнать почему остальные не работают.
Еще такой вопросик ...
по работе веб сервера получается что он считывает хтмл файл c контролелра в буфер, затем перебирая по символу содержимое буфера находит переменные и заменяет их значениями из символного файла. И потом выдаёт на отправку. Но здесь есть небольшоя проблемма, иногда происходит изменение кода хтмп файлов, такое чувство что открывает их и на чтение и на запись, хотя в коде сервера написано что открытие происходит только на чтение.Соотвественно вопрос , поясните как это он может менять код файлов?? Может я чего не понимаю .. или не знаю )) так скажите где почитать и разобраться во всем )
Филоненко Владислав
17.09.2007, 15:38
1. SysSockIoctl - работает, но как вы хотите увидеть работу блокирующего режима?
2. SysSockConnect - тоже.
С изменением html -как это выражается?
Тогда буду благодарен если вы укажете ошибку в данном куске кода.
если все работает, то переменное 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? Тип сокета - серверный - т.е. он должен получать запросы.
Что будет если "открываем файл только на чтение... и сразу после этого его закрываем". Укажите Ваш контроллер, таргет и прошивку.
да понятно что connect здесь не нужен, просто хотел сказать, что эти функции не работают. Функция listern в вашем примере не возвращает TRUE. А так как соккет у нас потоковый , а не дейтограммный, то функция эта должна быть и должна работать и возвращать TRUE.
Насчет контроллера - ПЛК 150, прошивка - 2.01.8., таргет - 2.0-4.
кстати насчет SysSockIoctl, в хелпе небольшая ошибка есть в описании, цитирую:
SysSockIoctl
Функция (из библиотеки SysLibSockets.lib) типа DINT, вызывает функцию ioctl операционной системы, для управления режимом I/O сокета. Возвращает TRUE при успешном окончании, иначе FALSE.
__________________________________________________ ___
Как это она может восвращать TRUE или FALSE, если тип функции DINT)))
насколько я понимаю TRUE = 1 , а FALSE = 0???
Она всегда возвращает 0, потму она не работет.
И вообще зачем эта функция здесь ? Если и без нее прекрасно все работает ?
это насчет хтмл, вот что получается иногда:
http://213.184.244.164/table2.html.
то что пишет мелким шрифром, того не было в начальном коде хтмл, это появилось потом.
Филоненко Владислав
18.09.2007, 11:49
Это наша недоработка, в библиотеке CodeSys функция возвращает 0/1, а у нас (-1) или номер сокета. А так она полностью работоспособна
т.е. если возвращает -1 то она сработала ? а если ноль то она не сработала ?
Филоненко Владислав
18.09.2007, 12:00
т.е. если возвращает -1 то она сработала ? а если ноль то она не сработала ?
-1 и меньше - ошибка, 0 и больше - все нормально. Возвращаемый аргумент 32 битовый со знаком
а что насчет функции listern???(см.выше)
Филоненко Владислав
18.09.2007, 15:45
А мы о чём разговаривали???
народ, вы что прикалываетесь ??!?
вы мне написали о значениях функции SysSockIoctl!!!
а теперь я хотел бы узнаить о функции listern, цитирую свой вопрос:
".........................Функция listern в вашем примере не возвращает TRUE. А так как соккет у нас потоковый , а не дейтограммный, то функция эта должна быть и должна работать и возвращать TRUE."
Филоненко Владислав
18.09.2007, 18:25
А я говорил о listen. Прикольно...
Хотя и SysSockIoct Это касалось.
Владислав, по вашим словам функция 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
проект в студию
Анализируя ответ функций чтения/записи и код посл. ошибки Вы и можете определить, есть соединение или нет.
Такой подход гарантирует, что вне зависимости от числа входящих соединений у Вас всегда для каждого требуемого сервиса будет нужное число сокетов.
Я, чесно говоря, запутался при осмыслении работы библиотеки. Так все же "одно соединение - один сокет" или я не забочусь о создании сокетов, один раз создал, а клиент при подключении получает свой сокет автоматически
Подскажите пожалуйста, почему
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
Возвращает значение -1?
Библиотеку подключил, а сокет не создается...
Аналогичная ситуация. Использую ПЛК100
понимаю что тема давнишняя, но вдруг кто отпишется...
Аналогичная ситуация. Использую ПЛК100
понимаю что тема давнишняя, но вдруг кто отпишется...
http://www.owen.ru/forum/attachment.php?attachmentid=6210&d=1338268380 пауза поможет рассмотреть код поближе :)
http://www.owen.ru/forum/attachment.php?attachmentid=6210&d=1338268380 пауза поможет рассмотреть код поближе :)
чудеса какие-то)) у вас та же самая функция с текстом один в один TcpServerOpenSocket открывает сокет и возвращает дискриптор 1, а у меня нифига. Ставлю точку останова сразу после этой функции и вижу что итог её работы -1 в дискрипторе.
прикрепляю файл проекта
чудеса какие-то)) у вас та же самая функция с текстом один в один TcpServerOpenSocket открывает сокет и возвращает дискриптор 1, а у меня нифига. Ставлю точку останова сразу после этой функции и вижу что итог её работы -1 в дискрипторе.
прикрепляю файл проекта
Значит берете и сбрасываете плк, видимо больше 15 раз открывали сокет, притом корректно не закрывая его, отсюда и проблемы
черт побери разобрался кажется. Взял сделал проект куда вынес только функцию открытия сокета сервера и стал построчно выполнять код. И выяснилось что в нижеприведенном тексте функция 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;
помнится где-то на форуме я встречал, что эта функция с багом и нужно возвращаемое ей значение просто игнорировать. Я прав?
ЗЫ: хотя, у вас то работает... Текст ф-ии открытия сокета один и тот же.
все оказалось верно. как только я забил на значение которое возвращает syssocklisten сразу все заработало и я был рад лицезреть в приемном буфере modbus кадры от лектуса))
Hai.. SAD,, I am getting same thing.. socket is not at all created its returning -1..
How you made it to run please.. explain
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? В частности мне не понятно как быть в таких случаях с адресацией(((
кроме сокетов, необходимо реализовать мастер либо слейв протокола модбас
а по поводу почему прием всегда пуст, мое видео сделано на одном плк, комп выступал в качестве шлюза меняя порты
КучаВопросов
19.01.2014, 21:50
[QUOTE=capzap;128422]кроме сокетов, необходимо реализовать мастер либо слейв протокола модбас
это в конфигурации необходимо реализовывать?
[QUOTE=capzap;128422]а по поводу почему прием всегда пуст, мое видео сделано на одном плк, комп выступал в качестве шлюза меняя порты
я тож делал на одном плк. Но почему -то не получалось(
выложенный тут (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) пример работает?
Попробовал.Работает.
Значит остается проверить как сделана принимаемая часть,то бишь сервер, за основу можно взять из бибки tcpudplib
КучаВопросов
20.01.2014, 10:22
У меня создается и сервер(номер сокета 1) и клиент(номер сокета 2). Вы говорили что, комп выступал в качестве шлюза меняя порты. Что для этого надо сделать?
в линуксе достаточно такой команды
while true; do nc -l 503 | nc 192.168.1.88 502; done;слушает свой локальный порт 503 и все что туда приходит отправляет по адресу АйПи такой то порт 502, в винде точно незнаю, наверное и готовые приложения есть
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot