Они и должны возвращать -1 при отсутствии данных.
Варианта 2 - либо считать код посл ошибки, либо таймаут на обрыв связи.
Лучше и то и другое
Они и должны возвращать -1 при отсутствии данных.
Варианта 2 - либо считать код посл ошибки, либо таймаут на обрыв связи.
Лучше и то и другое
Тролль-наседка, добрый, нежный и ласковый
CASE o_eCondition OF
ST_EXPECT:
IF i_pOptions^.bEnable THEN
IF m_dnSocket = SOCKET_INVALID THEN
m_dnSocket := SysSockCreate( SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_IP );
ELSE
IF SysSockSetOption( m_dnSocket, SOCKET_SOL, SOCK_NBIO, 0, 0 ) THEN
o_eCondition := ST_SETUP;
ELSE
o_eCondition := ST_CLOSE;
END_IF
END_IF
END_IF
ST_SETUP:
m_y := 255;
o_eCondition := ST_CONECT;
m_SAddress.sin_family := SOCKET_AF_INET;
IF i_pOptions^.bServer THEN
m_SAddress.sin_addr := SOCKET_INADDR_ANY;
m_SAddress.sin_port := SysSockHtons( i_pOptions^.wMyPort );
IF NOT SysSockBind( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
o_eCondition := ST_CLOSE;
END_IF
ELSE
m_SAddress.sin_port := SysSockHtons( i_pOptions^.wOutPort );
m_SAddress.sin_addr := SysSockHtonl( SHL( SHL( SHL(
BYTE_TO_DWORD( i_pOptions^.yOutAddr1 ), 8 )
OR BYTE_TO_DWORD( i_pOptions^.yOutAddr2 ), 8 )
OR BYTE_TO_DWORD( i_pOptions^.yOutAddr3 ), 8 )
OR BYTE_TO_DWORD( i_pOptions^.yOutAddr4 ) );
END_IF
ST_CONECT:
m_y := m_y + 1;
IF ( m_y MOD 50 ) = 0 THEN
IF i_pOptions^.bServer THEN
o_dnRes := BOOL_TO_DINT( SysSockListen( m_dnSocket, 1 ) );
IF i_pOptions^.ePCL = OVEN_110_v2 THEN
IF o_dnRes < 0 THEN
o_eCondition := ST_CLOSE;
ELSE
o_eCondition := ST_ACCEPT;
END_IF
ELSE
IF o_dnRes = 0 THEN
o_eCondition := ST_WORK;
END_IF
END_IF
ELSIF NOT SysSockConnect( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) ) THEN
o_eCondition := ST_WORK;
END_IF
END_IF
ST_ACCEPT:
m_dnClient := SysSockAccept( m_dnSocket, ADR( m_SAddress ), SIZEOF( m_SAddress ) );
IF NOT i_pOptions^.bEnable THEN
o_eCondition := ST_CLOSE;
ELSIF m_dnClient <> SOCKET_INVALID THEN
o_eCondition := ST_WORK;
END_IF
ST_WORK:
IF NOT i_pOptions^.bEnable THEN
o_eCondition := ST_BREAK;
END_IF
ST_BREAK:
o_dnRes := BOOL_TO_DINT ( SysSockShutdown( m_dnSocket, 2 ) );
CASE i_pOptions^.ePCL OF
OVEN_100: m_b := o_dnRes = 1;
OVEN_110: m_b := o_dnRes = 1;
OVEN_110_v2: m_b := o_dnRes = 0;
END_CASE
IF m_b THEN
o_eCondition := ST_CLOSE;
END_IF
ST_CLOSE:
o_bLink := FALSE;
m_tonExpet( IN := o_bLink );
IF m_dnClient <> SOCKET_INVALID THEN
IF SysSockClose( m_dnClient ) = 1 THEN
m_dnClient := SOCKET_INVALID;
END_IF
END_IF
o_dnRes := BOOL_TO_DINT( SysSockClose ( m_dnSocket ) );
CASE i_pOptions^.ePCL OF
OVEN_100: m_b := o_dnRes = 1;
OVEN_110: m_b := o_dnRes = 0;
OVEN_110_v2: m_b := o_dnRes = 1;
END_CASE
IF m_b
AND m_dnClient = SOCKET_INVALID THEN
m_dnSocket := SOCKET_INVALID;
o_eCondition := ST_EXPECT;
END_IF
END_CASE
здесь и сервер и клиент для всех ПЛК. Но на новом 110 все еще остаюцо траблы. после программного сброса сокеты не работают. это не так страшно, но неудобно.