UdpOpenSend(Receive)Socket наверное?
UdpOpenSend(Receive)Socket наверное?
Тролль-наседка, добрый, нежный и ласковый
UDPopenReceiveSocket.png
Я нажимаю на нее, и показывает его только блоком. Может быть возможно как-то включить детализацию кода этой функции?
Но на англоязычном форуме КДС, я находил примеры. И там эта функция была расписана так:
diSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0); (* открыли сокет типа Datagram для UDP по умолчанию 0*)
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:= -1 ну или SOCKET_INVALID*)
diSocket:=SOCKET_INVALID;
END_IF
UdpOpenReceiveSocket:=diSocket;
Я так и создаю сокет для UDP
Так саму библиотеку загрузите как проект
Тролль-наседка, добрый, нежный и ласковый
Хорошо, будем последовательными. Отправка из библиотеки NetVarUdp. Выглядит следующим кодом (без всяких подфункций, все вытащим в один код монолитный)
Положительно то, что на ПК (терминал) пришло сообщение, наконец-то. Но это если отключить GetIPAddress и вещать BROADCAST на всех кто слышит. Если stIPAddress я объявлял STRING:='10.0.6.11' так было в примере одной библиотеки иностранной, ну и в NetVar написано мол - stIPAddress:STRING;(* IP-address or name *) . Но Тогда он не передает сообщение.
Так как Вы писали "нюанс с разворотом IP адресов" , прошу пояснить чуть чуть подробнее. Как задать здесь правильно IP?
И почему в этой библиотеке SysOption был отключен (* *)? В прочем работает как с ней так и без нее.
IF start THEN
IF HandleSocket<0 THEN
HandleSocket:=SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, 0);
bOption:=TRUE;
(*SysSockSetOption(diSocket, SOCKET_SOL, SOCKET_SO_BROADCAST, ADR(bOption), SIZEOF(bOption));*)
sa.sin_family:=SOCKET_AF_INET;
sa.sin_addr:=SOCKET_INADDR_ANY;
sa.sin_port:=SysSockHtons(iPort);
bResult:=SysSockBind(HandleSocket, ADR(sa), SIZEOF(sa));
IF bResult = FALSE THEN
diSocket:=SOCKET_INVALID;
END_IF
ELSE
sa.sin_family:=SOCKET_AF_INET;
(*IF stIPAddress <> '' THEN sa.sin_addr:=GetIPAddress(stIPAddress);
ELSE*)
sa.sin_addr:=SOCKET_INADDR_BROADCAST;
(*END_IF*)
sa.sin_port:=SysSockHtons(iPort);
numberofbyte:=SysSockSendTo(HandleSocket, ADR(MessageToPC), SIZEOF(MessageToPC), 0, ADR(sa), SIZEOF(sa));
IF numberOfByte>0 AND marker=0 THEN
marker := numberofByte;
SysSockClose(HandleSocket);
END_IF
IF numberOfByte>0 THEN
marker := numberofByte;
SysSockClose(HandleSocket);
END_IF
END_IF
ELSE
IF HandleSocket<>SOCKET_INVALID THEN
SysSockClose(HandleSocket);
HandleSocket:=SOCKET_INVALID;
MessageFromPC:=Zero;
END_IF
END_IF
1, IP задаём как DWORD
2. SOCKET_SO_BROADCAST - он и так включён по умолчанию вот и работает
3. GetIPAddress - это что за функция?
Мы пользуемся SysSockGetHostByName(), куда можно подавать как IP в символьном виде "10.2.1.1", так и имя "my_own_pupkin.server.net", если оно доступно через DNS
Возвращает 1-й IP из ответа DNS сервера или 0 если не получен ответ.
P.S. IP DNS серверов должны быть прописаны в local_adress.dat (ну или включён режим DHCP), иначе не работает
Последний раз редактировалось Филоненко Владислав; 01.02.2017 в 15:20.
Тролль-наседка, добрый, нежный и ласковый
Правильно ли я понял ?
1. IPadr: DWORD:=16#A0006B; (*10.0.6.11*)
2. Как Вы научили открыл NetVarUDP_lib_V23 и там в FUN UdpSendData был этот GetIPaddress.
diIPAddress := SysSockInetAddr(stIPAddress);
IF (stIPAddress = '255.255.255.255') THEN
(*Avoid name-resolution on our default broadcast address.*)
GetIPAddress:=diIPAddress;
RETURN ;
END_IF
IF diIPAddress = SOCKET_INADDR_NONE THEN
diIPAddress := SysSockGetHostByName(ADR(stIPAddress));
END_IF
GetIPAddress:=diIPAddress; Такой код
3. sa.sin_addr:=SysSockGetHostByName(IPadr);
символьный вид это так? sa.sin_addr:=SysSockGetHostByName(10.0.6.11); но это не компилируется.
GetIPaddress - это внутренняя функция библиотеки. Ишак не мой
Символьное - это "10.0.6.11"
Тролль-наседка, добрый, нежный и ласковый
Я, прошу прощенья, за глупые вопросы, но так не компилируется
sa.sin_addr:=SysSockGetHostByName("10.0.6.11");
Ошибка 4268: PLC_PRG (16): Необходимо выражение
Я так понял, IP DNS серверов должны быть прописаны в local_adress.dat только в случае указания в стиле имени "my_own_pupkin.server.net"
p.s. из любопытства фраза "Ишак не мой" из какого фильма, что-то знакомое а вспомнить не могу. :-)
ошибся, должно быть 'string'
P.S. Ходжа Нассредин бессмертен, однако.
Тролль-наседка, добрый, нежный и ласковый
удалось прописать string'ом через указатель
sa.sin_addr:=SysSockGetHostByName(ADR(stIPAddress) ); но на терминал ничего не приходит.
меняю на
sa.sin_addr:=SOCKET_INADDR_BROADCAST; посылка приходит на терминал (при прочих равных условиях).
Владислав, спасибо Вам большое за науку. Но что-то не получается. Если есть идеи, скажите, я их попытаюсь реализовать. В CoDeSys я всего неделю, и видимо зашел не с подножья, а с вершины горы. Поэтому такой результат.