не будет
CASE FASE_CONNECT OF
0: (* ОТКРЫТИЕ СОКЕТА *)
sock_UDP := SysSockCreate( SOCKET_AF_INET, SOCKET_DGRAM, SOCKET_IPPROTO_UDP );
sock_adr_in.sin_addr := SOCKET_INADDR_ANY; (* АДРЕС ДЛЯ ПОЛУЧЕНИЯ ПАКЕТОВ - ЛЮБОЙ *)
sock_adr_in.sin_family := SOCKET_AF_INET; (* протокол IPv4 *)
sock_adr_in.sin_port := SysSockHtons( 5555 ); (* НОМЕР ПОРТА ДЛЯ ПОЛУЧЕНИЯ ВХОДНЫХ ПАКЕТОВ. используем функцию привода номера порта к стандарту *)
FASE_CONNECT := 90;
90:
RES_OPT := SysSockSetOption( sock_UDP, SOCKET_SOL, SOCKET_SO_REUSEADDR, 0, 0 );
BIND_RES := SysSockBind( sock_UDP, ADR( sock_adr_in ), SIZEOF( sock_adr_in ) ); (* ПРИВЯЗАТЬ СОКЕТ к портам и адресам ДЛЯ ПРОСЛУШКИ *)
(* поля структуры будут заполнены при приеме пакета *)
sock_adr_out.sin_addr := 16#0A000601; (* АДРЕС ДЛЯ ОТПРАВКИ ПАКЕТОВ, ПОЛЯ МОГУТ БЫТЬ ПРОИЗВОЛЬНЫМИ - БУДУТ ЗАПОЛНЕНЫ ПРИ ПОЛУЕНИИ ДАТАГРАММЫ *)
sock_adr_out.sin_family := SOCKET_AF_INET;
sock_adr_out.sin_port := SysSockHtons( 5555 ); (* НОМЕР ПОРТА НА КОТОРЫЙ ОТВЕЧАЕМ - БУДЕТ ЗАПОЛНЕН ПО ПОЛУЧЕНИЮ ВХОДНОГО ПАКЕТА *)
RES_OPT := SysSockSetOption( sock_UDP, SOCKET_SOL, SOCK_NBIO, 0, 0 ); (* ПЕРЕВЕСТИ СОКЕТ В НЕБЛОКИРУЮЩИЙСЯ РЕЖИМ для М02 *)
FASE_CONNECT := 1;
(* TRUE_ADDR := SysSockHtonl( 16#0A000601 );*)
1: (* ОЖИДАЕМ ПРИЕМ *)
READ_BYTES := SysSockRecvFrom( sock_UDP, ADR( BUF_RCV[0] ), 1535, 0, ADR( sock_adr_out ), SIZEOF( sock_adr_out ) ); (* ПРИНЯТЬ ДАННЫЕ, НАКОПЛЕННЫЕ ЗА ИНТЕРВАЛ - поместить в структуру обратный адрес пакета *)
(* read_bytes - количество байт данных
buf_rcv - данные
sock_adr_out - адрес и порт откуда получена датаграмма *)
IF READ_BYTES > 0 THEN
(* ЕСТЬ ПРИНЯТЫЕ ДАННЫЕ В ТЕКУЩЕМ ЦИКЛЕ - ДАННЫЕ ИЗ ПРОИЗВОЛЬНОГО ИСТОЧНИКА *)
(*
TEST_D := TEST_D + READ_BYTES;
*)
PACK_COUNTER := PACK_COUNTER + 1;
(* нужно было в прошивке 0.3.53 *) (* так в прошивке 0.3.66 *)
IF sock_adr_out.sin_addr = (*SysSockHtonl( 16#0A000601 )*) (*TRUE_ADDR*) 16#0A000601 THEN (* используем функцию привода адреса к стандарту *)
(* ДАТАГРАММА ОТ КОМПЬЮТЕРА - ПРАВИЛЬНОГО ХОСТА! *)
FASE_CONNECT := 22;
END_IF
END_IF
22* ОБРАБОТАТЬ ПРИНЯТЫЙ ПАКЕТ, ПОДГОТОВИТЬ ОТВЕТ *)
FASE_CONNECT := 33;
(* ПЕРЕДАЕМ БУФЕР В СОКЕТ *)
RES := SysSockSendTo( sock_UDP, ADR( BUF_SND[0] ), LENGHT + 5, 0, ADR( sock_adr_out ), SIZEOF( sock_adr_out ) ); (* ПЕРЕДАТЬ ДАННЫЕ В СОКЕТ *)
(* УСТАНОВИМ ФАЗУ ОЖИДАНИЯ ВХОДЯЩЕГО ПАКЕТА *)
FASE_CONNECT := 1;
END_CASE





* ОБРАБОТАТЬ ПРИНЯТЫЙ ПАКЕТ, ПОДГОТОВИТЬ ОТВЕТ *)
Ответить с цитированием