Вход

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



v97ssv
28.01.2011, 11:07
Добрый день
Помогите разобраться. Имею ПЛК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. подскажите что я не так делаю.. Спасибо

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

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

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

capzap
16.06.2014, 13:49
Если у вас сокеты на ПЛК не работают, так не говорите, что они у вас поддерживаются. Люди смотрят, думают сейчас всё легко сделают, а на практике весь форум уже исписан по поводу этой кривой библиотеки.
http://www.owen.ru/forum/showthread.php?t=12729&p=83833&viewfull=1#post83833 работает же
Сокеты на плк работают, если при отладке некорректно закрыли сокет, то последующее открытие займет другую сущность и так не более 15 раз

ЗЫ многим смотрящим людям вообще не рекомендуется заниматься программированием

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

Максим Tomahawk
08.08.2014, 05:44
Снова вернулся к проекту. Надо было с ПК считывать данные из сокет-сервера на ПЛК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 - претензий нет, работают как и заявлено.

lazy
08.08.2014, 16:55
по поводу 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 )

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

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

код в студию. траблы есть но если разобрацо все пашет без нареканий )