CODESYS форум
https://forum-ru.codesys.com/

Связь по TCP IP с использованием библиотеки SysLibSockets
https://forum-ru.codesys.com/viewtopic.php?f=2&t=1782
Страница 1 из 1

Автор:  VladJ [ Пт май 25, 2012 9:43 am ]
Заголовок сообщения:  Связь по TCP IP с использованием библиотеки SysLibSockets

Добрый день! Пробую использовать SysLibSockets.

Написал код для "сервера":

SST_INIT:
IF m_dnServerSocket = SOCKET_INVALID THEN
m_dnServerSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
END_IF;
IF m_dnServerSocket <> SOCKET_INVALID THEN
o_eCondition := SST_SETUP;
END_IF;

SST_SETUP:
IF SysSockSetOption( m_dnServerSocket, SOCKET_SOL, SOCKET_SO_REUSEADDR, ADR( m_dnTrue ), SIZEOF( m_dnTrue ) ) THEN (* m_dnTrue = 1 *)
m_ServerSAddres.sin_family := SOCKET_AF_INET;
m_ServerSAddres.sin_addr := SOCKET_INADDR_ANY;
m_ServerSAddres.sin_port := SysSockHtons( 502 );
IF NOT SysSockBind( m_dnServerSocket, ADR( m_ServerSAddres ), SIZEOF( m_ServerSAddres ) ) THEN
o_eCondition := SST_CLOSE;
ELSIF SysSockIoctl( m_dnServerSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) <> 0 THEN (* m_dnTrue = 1 *)
o_eCondition := SST_CLOSE;
ELSE
o_eCondition := SST_LISTEN;
END_IF;
END_IF;

SST_LISTEN:
IF SysSockListen( m_dnServerSocket, 1 ) THEN
o_eCondition := SST_ACCEPT;
ELSE
m_dnError := 0;
m_dwSize := SIZEOF( m_dnError );
IF NOT SysSockGetOption( m_dnServerSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) )
OR NOT ( m_dnError = 0 OR m_dnError = 235 ) THEN (* Operation would block or no error *)
o_eCondition := SST_CLOSE;
END_IF;
END_IF;

SysSockListen TRUE не возвращает m_dnError = 0. Дальше "прослушки" дело не идет.

Вот код "клиента":

CST_INIT:
IF m_dnSocket = SOCKET_INVALID THEN
m_dnSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP );
END_IF;
IF m_dnSocket <> SOCKET_INVALID THEN
o_eCondition := CST_SETUP;
END_IF;

CST_SETUP:
IF SysSockIoctl( m_dnSocket, SOCKET_FIONBIO, ADR( m_dnTrue ) ) = 0 THEN (* m_dnTrue = 1 *)
m_SAddress.sin_family := SOCKET_AF_INET;
m_SAddress.sin_addr := 16#0A000008; (* ip "сервера" *)
m_SAddress.sin_port := SysSockHtons ( 502 );
o_eCondition := CST_CONNECT;
END_IF;

CST_CONNECT:
IF m_tonExpect.Q THEN
m_tonExpect( IN := FALSE );
IF SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
o_eCondition := CST_RCV;
ELSE
m_dnError := 0;
m_dwSize := SIZEOF( m_dnError );
IF NOT SysSockGetOption( m_dnSocket, SOCKET_SOL, SOCKET_SO_ERROR, ADR( m_dnError ), ADR( m_dwSize ) ) THEN
o_eCondition := CST_CLOSE;
ELSIF m_dnError = 256 THEN (* Socket is already connected *)
o_eCondition := CST_RCV;
ELSIF NOT ( m_dnError = 235 OR m_dnError = 0 ) THEN (* Operation would block or no error *)
o_eCondition := CST_CLOSE;
END_IF;
END_IF;
END_IF;
m_tonExpect( IN := TRUE, PT := T#3s );

SysSockConnect TRUE не возвращает m_dnError = 0. Сокеты создаются но связаться не получается. Что я делаю не так? Буду признателен за любую помощь или пинок. Спасибо. ))

PS: без "отступов" все это трудночитаемо, но как сделать чтобы они отображались не разобрался. амсори )

Автор:  Mikhail Shvetsov [ Чт май 31, 2012 5:54 am ]
Заголовок сообщения:  Re: Связь по TCP IP с использованием библиотеки SysLibSocket

Судя по коду - это версия 2
по версии 2 есть пример на сайте 3s клиент-серверного приложения
ftp://ftp2.3s-software.com/pub/Examples ... ion/TcpIp/

Страница 1 из 1 Часовой пояс: UTC+01:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/