Показано с 1 по 9 из 9

Тема: помогите с SysSockListen

  1. #1

    По умолчанию помогите с SysSockListen

    Добрый день
    Помогите разобраться. Имею ПЛК110-60
    хочу на нем реализовать TCP сервер
    но почему-то НИКОГДА функция SysSockListen не возвращает TRUE.
    вот код


    sa.sin_family:=SOCKET_AF_INET;
    sa.sin_addr:=SOCKET_INADDR_ANY;
    sa.sin_port:=SysSockHtons(502);


    CASE prog_step OF
    0:
    IF diSocket =SOCKET_INVALID THEN
    diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM,0); (*создание TCP-сокета*)
    ELSE prog_step:=1;
    END_IF

    1:
    bresBind := SysSockBind (diSocket, ADR(sa), SIZEOF( sa ) );
    IF bresBind = TRUE THEN
    prog_step:=2;
    END_IF;

    2:

    bresListen := SysSockListen(diSocket, diMaxConnections );
    IF bresListen = TRUE THEN
    prog_step:=3;
    END_IF

    3:

    diSocketClient := SysSockAccept( diSocket, ADR(saClient), SIZEOF(saClient));
    IF diSocketClient<>SOCKET_INVALID THEN
    prog_step:=4;
    END_IF;

    4:
    res:= SysSockSend ( diSocketClient, ADR(byBuffer), diBufferSize, 0 ) ;
    prog_step:=5;

    5:
    stClose:=SysSockClose(diSocket); (*закрытие сокета*)
    prog_step:=6;

    6:
    ;

    END_CASE


    prog_step останавливаеться на 2, а переменная bresListen всегад равна false. подскажите что я не так делаю.. Спасибо

  2. #2

    По умолчанию

    Все очень просто. команда listen возвращает либо ошибку (-1), либо номер сокета. Который может быть и нулевым.
    Из-за ошибки в первоначальном описании библиотеки мы так и сделали, а потом менять было уже поздно.

  3. #3
    Пользователь
    Регистрация
    20.07.2011
    Адрес
    Новосибирск
    Сообщений
    38

    По умолчанию

    У вас библиотеки каждый год меняются? Скачана SysLibSockets версии 20.2.06 13:31:14 с вашего сайта (пакет библиотек Codesys Версия 8.12). Смотрю через менеджер библиотек в кодесис, функция SysSockListen возвращает BOOL. Пытаюсь поднять сервер на ПЛК100, создаю слушающий сокет, связываю его через Bind, а когда доходит до SysSockListen, она всегда возвращает FALSE.

    Если у вас сокеты на ПЛК не работают, так не говорите, что они у вас поддерживаются. Люди смотрят, думают сейчас всё легко сделают, а на практике весь форум уже исписан по поводу этой кривой библиотеки.
    Автоматизирую, как завещал нам Генри Форд

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,255

    По умолчанию

    Цитата Сообщение от Максим Tomahawk Посмотреть сообщение
    Если у вас сокеты на ПЛК не работают, так не говорите, что они у вас поддерживаются. Люди смотрят, думают сейчас всё легко сделают, а на практике весь форум уже исписан по поводу этой кривой библиотеки.
    http://www.owen.ru/forum/showthread....ll=1#post83833 работает же
    Сокеты на плк работают, если при отладке некорректно закрыли сокет, то последующее открытие займет другую сущность и так не более 15 раз

    ЗЫ многим смотрящим людям вообще не рекомендуется заниматься программированием
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    SysSockAccept - бессмысленна. нужно не использовать )
    SysSockListen - возвращает НОЛЬ когда коннект есть. но может придецо вызвать ее несколько раз. только в разных циклах плк. (SysSockConnect - тожсамое )

  6. #6
    Пользователь
    Регистрация
    20.07.2011
    Адрес
    Новосибирск
    Сообщений
    38

    По умолчанию

    Снова вернулся к проекту. Надо было с ПК считывать данные из сокет-сервера на ПЛК100, проверял работоспособность через telnet. Перечитав форум понял, что библиотека SysLibSockets имеет много проблем, учел эти моменты. Но почему нельзя было о возвращаемых значениях функций сразу написать в SysLibSockets_RU.pdf? Народ бы не задавал лишних вопросов, если бы документация была корректна. По факту получается следующее:

    1) SysSockListen - кривая, писали уже об этом. Возвращает false всегда, независимо от успеха соединения, с lazy я не соглашусь. Он преобразует bool в int, но раз изначально был false, при переводе в int другое значение не появится. Можно не делать bind, и увидите, что listen на это не реагирует.

    2) SysSockRecv - возвращает SOCKET_INVALID когда соединения нет, 0 - когда соединение установлено(!), и в момент приёма выдаёт кол-во принятых байт. В документации написано совсем противоположное! "Возвращает число считанных бит" - кто вообще это писал...

    3) SysSockSend - должно быть по аналогии с Recv, я смотрел только кол-во отправленных байт.

    4) SysSockCreate и SysSockBind - претензий нет, работают как и заявлено.
    Последний раз редактировалось Максим Tomahawk; 08.08.2014 в 07:19.
    Автоматизирую, как завещал нам Генри Форд

  7. #7

    По умолчанию

    по поводу BOOL_TO_INT
    попробуйте ради эксперимента:

    bresListen := false;

    if SysSockListen(diSocket, diMaxConnections ) then
    bresListen := true;
    end_if

    if not SysSockListen(diSocket, diMaxConnections ) then
    bresListen := true;
    end_if

    сам именно этот код не проверял но может оказацо интересно )
    в смысле -1 это и не true и не false )

  8. #8

    По умолчанию

    Сокеты действительно на ПЛК100 работают коряво. Так например у меня не хватило сил добиться создания МОДБАС TCP сервера (slave). Тупо отказывается работать. Коннект идет, а вот приема данных нет.

  9. #9

    По умолчанию

    Цитата Сообщение от Shamr80 Посмотреть сообщение
    Сокеты действительно на ПЛК100 работают коряво. Так например у меня не хватило сил добиться создания МОДБАС TCP сервера (slave). Тупо отказывается работать. Коннект идет, а вот приема данных нет.
    код в студию. траблы есть но если разобрацо все пашет без нареканий )

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •