да, прошу прощения не правильно выразился =)
"чтобы отследить другие пакеты нужна другая ОС и другие средства." - не подскажите что за такие средства и ОС? Линукс?
да, прошу прощения не правильно выразился =)
"чтобы отследить другие пакеты нужна другая ОС и другие средства." - не подскажите что за такие средства и ОС? Линукс?
Делая что-то не правильно, вы никогда не потеряете полученный опыт
Эммм... а как расшифровывается BE, LE?
Подскажите пожалуйста, как в данном случае можно указать адрес (.sin_addr) в правильном формате с помощью htonl() ?
Вот отрывок из рабочего кода на данный момент в ПЛК ОВЕН110-30М:
IF diSocket = SOCKET_INVALID THEN
diSocket := SysSockCreate(SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP);
IF diSocket <> SOCKET_INVALID THEN
sa_SendRecv.sin_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(strIPaddress[0] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[1] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[2] ), 8 )
OR BYTE_TO_DWORD( strIPaddress[3] );
sa_SendRecv.sin_family := SOCKET_AF_INET;
sa_SendRecv.sin_port := SysSockHtons(wPort);
END_IF
END_IF
Последний раз редактировалось vooodooo22; 28.01.2016 в 13:32.
Делая что-то не правильно, вы никогда не потеряете полученный опыт
BE vs LE это как битва тупо и остроконечников.
Порядок байт, на Интел BE (Big Endian), на ARM LE (little endian).
Соответственно
sa_SendRecv.sin_addr := SysSockHtonl(IP_addr);
И ведь 1/2 Вы сделали, поставив sa_SendRecv.sin_port := SysSockHtons(wPort); ?!?
Тролль-наседка, добрый, нежный и ласковый
я так понимаю тип данных переменной IP_addr тут будет DWORD. Т.е. изначально все равно необходимо привести IP адрес к DWORD`у из байтового массива. Например:
так? =)dwIP_addr : DWORD;
abyIPaddress : ARRAY[0..3] OF BYTE := '192.168.225.021';
dwIP_addr := SHL( SHL( SHL(
BYTE_TO_DWORD(abyIPaddress[0] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[1] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[2] ), 8 )
OR BYTE_TO_DWORD( abyIPaddress[3] );
sa_SendRecv.sin_addr := SysSockHtonl(dwIP_addr);
Делая что-то не правильно, вы никогда не потеряете полученный опыт
Спасибо большое! Теперь все работает и на реальном ПЛК и на симуляторе!
Сейчас разбираюсь с блокирующими сокетами. Есть такая функция SysSockSelect(). Не до конца понимаю что должны принимать ее параметры fdRead, fdWrite и fdExcept.
Подскажите пожалуйста правильно ли я понимаю, что каждый из этих параметров это массив (тип данных не понял), который в каждой ячейке памяти хранит значение дискриптора сокета (или значение SOCKET_INVALID)?
Как в таком случае правильно задать параметры для функции SysSockSelect()?
Прошу прощения за расторопность, описание нашел в справке Codesys v2.3 =)
Последний раз редактировалось vooodooo22; 01.02.2016 в 09:31.
Делая что-то не правильно, вы никогда не потеряете полученный опыт