PDA

Просмотр полной версии : SysSockShutdown



monteg
24.03.2018, 22:32
Здравствуйте,
знающие люди, подскажите нужно ли использовать SysSockShutdown, и если нужно, то как, и какие значения параметра diHow?

ЗЫ: особенно интересует это тема для ПЛК110 М01 и М02

Филоненко Владислав
26.03.2018, 09:29
Обязательно, diHow==2

monteg
26.03.2018, 10:41
Обязательно, diHow==2

Т.е. SysSockShutdown обязательно нужно вызывать перед закрытием сокета. SysSockShutdown и SysSockClose можно выполнять в одном цикле и лучше разнести?

monteg
26.03.2018, 14:08
Обязательно, diHow==2
А что вообще делает эта функция?

Зинько Владислав
26.03.2018, 15:02
А что вообще делает эта функция?

Добрый день.
Параметр diHow указывает, какой из каналов будет закрыт.
В описании библиотеки указано, что этот параметр соответствует параметрам для аналогичной функции в Win32.

Судя по всему, значение "2" указывает на то, что закрываются оба канала сразу ("клиент" и "сервер").
Значения "0" - закрывается только канал "клиент", "1" - закрывается канал "сервер".

monteg
27.03.2018, 14:19
Добрый день.
Параметр diHow указывает, какой из каналов будет закрыт.
В описании библиотеки указано, что этот параметр соответствует параметрам для аналогичной функции в Win32.

Судя по всему, значение "2" указывает на то, что закрываются оба канала сразу ("клиент" и "сервер").
Значения "0" - закрывается только канал "клиент", "1" - закрывается канал "сервер".

Т.е. эта функция вносит изменения в исполняемую среду и к обмену данными не приводит.
Просто я сейчас пытаюсь сокеты освоить. Делаю обмен данными между двумя ПЛК, ПЛК110-30 М01 и ПЛК110-30 М02. Обмен данными идет. Можно даже сказать, что хорошо идет. Но есть косяк, если один из ПЛК выключить, то обмен данными не всегда возобновляется. А М02 SysSocketConnect зависает, если сервер выключен.
Документации по этой теме достоверной нет, поэтому информацию беру из форума. Но на форуме информация тоже не однозначная. И не понятно, откуда ее люди вообще берут.

Трофимов Артем
27.03.2018, 15:17
Т.е. эта функция вносит изменения в исполняемую среду и к обмену данными не приводит.
Просто я сейчас пытаюсь сокеты освоить. Делаю обмен данными между двумя ПЛК, ПЛК110-30 М01 и ПЛК110-30 М02. Обмен данными идет. Можно даже сказать, что хорошо идет. Но есть косяк, если один из ПЛК выключить, то обмен данными не всегда возобновляется. А М02 SysSocketConnect зависает, если сервер выключен.
Документации по этой теме достоверной нет, поэтому информацию беру из форума. Но на форуме информация тоже не однозначная. И не понятно, откуда ее люди вообще берут.

SysSockSetOption( SOCK, SOCKET_SOL, SOCK_NBIO, 0, 0 ) ;
сделает сокет неблокирующим, в этом случае зависания не будет, если сервер не может обработать запрос. после коннекта в неблокирующем режиме необходимо 2-3 мс подождать , чтобы сервер обработал запрос, после этого начинайте обмен данными, только контролируйте число отданных / принятых байт, если послыки будут большими.

monteg
27.03.2018, 15:35
SysSockSetOption( SOCK, SOCKET_SOL, SOCK_NBIO, 0, 0 ) ;
ну да, где SOCK_NBIO=1014, пробовал, не помогает.
Все операции с сокетами разнес по циклам, минимальное MinCycleLength = 10, между SysSoskConnect и SysSockSend задержки ставил разные, до нескольких секунд.

monteg
27.03.2018, 15:48
Блин, вот я чудак, SOCK_NBIO=16#1014

Трофимов Артем
27.03.2018, 16:28
завелся обмен?

monteg
27.03.2018, 16:43
завелся обмен?
да, пока все хорошо, спасибо