Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

Связь по TCP IP с использованием библиотеки SysLibSockets

VladJ
2012-05-25
2012-05-31
  • VladJ

    VladJ - 2012-05-25

    Добрый день! Пробую использовать 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: без "отступов" все это трудночитаемо, но как сделать чтобы они отображались не разобрался. амсори )

     
  • Anonymous - 2012-05-31

    Originally created by: Mikhail Shvetsov

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