CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Чт ноя 23, 2017 2:40 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 2 сообщения ] 
Автор Сообщение
СообщениеДобавлено: Пт май 25, 2012 9:43 am 
Не в сети

Зарегистрирован: Вт фев 07, 2012 11:31 am
Сообщения: 13
Добрый день! Пробую использовать 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: без "отступов" все это трудночитаемо, но как сделать чтобы они отображались не разобрался. амсори )


Вернуться к началу
СообщениеДобавлено: Чт май 31, 2012 5:54 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Судя по коду - это версия 2
по версии 2 есть пример на сайте 3s клиент-серверного приложения
ftp://ftp2.3s-software.com/pub/Examples ... ion/TcpIp/


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 2 сообщения ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB