Вверх ↑
Этот топик читают: Гость
Ответов: 704
Рейтинг: 7
#226: 2018-08-31 17:35:08 ЛС | профиль | цитата
doSendAllAsync в сервере отошлет всем, даже тем кто не завершил передачу данных? Общаюсь с контроллером мега2561 и он бывает теряет некоторые запросы на этот компонент сервера. Может он их теряет потому, что я по событию от одного принятого соединения отправляю данные "принято" сразу всем, и тем соединениям которые ще не успели передать данные? Вот кусочек моего безобразия, уже с мьютексами пошел изгаляться.

Add(SafeMode,13933790,420,133)
{
Name="InServ1"
Wait_Abandoned=0
WaitMode=1
link(onSafeMode,9234107:doEvent,[])
}
Add(SafeMode,6331467,266,91)
{
Name="InServ1"
Wait_Abandoned=0
link(onSafeMode,8053461:doEvent1,[])
}
Add(Switch,14987715,476,91)
{
DataOn=Integer(0)
DataOff=Integer(1)
Default=0
Point(State)
Point(doOn)
}
Add(IndexToChanel,9234107,476,133)
{
Point(Index)
link(onEvent1,11786265:doPop,[])
link(Index,14987715:State,[])
}
Add(Timer,5337033,371,133)
{
Interval=50
Enable=1
link(onTimer,13933790:doSafeMode,[])
AddHint(5,47,27,13,Interval)
AddHint(-79,18,40,13,Enable)
}
Add(Hub,5008916,91,35)
{
OutCount=4
link(onEvent2,3732584:doStartServer,[(193,48)(193,104)])
}
Add(Hub,13568669,581,133)
{
OutCount=4
link(onEvent1,14987715:doReset,[(606,139)(606,83)(466,83)(466,104)])
link(onEvent4,14987715:doOn,[(606,160)(606,174)(466,174)(466,111)])
}
Add(TCPServer,3732584,210,91)
{
Port=234
AsyncEvents=1
OverSend=1
Point(onSend)
Point(onErrorSend)
Point(onErrorStart)
Point(doSendAll)
Point(doSendAsync)
Point(doSendAllAsync)
Point(doCloseAll)
link(onReceive,6331467:doSafeMode,[])
link(Data,13456184:Text,[(216,82)(146,82)(146,145)(160,145)])
link(ClientID,3732584:CurClientID,[(223,82)(237,82)(237,159)(223,159)])
AddHint(79,95,37,13,AsyncEvents)
}
Add(Hub,8053461,315,91)
{
link(onEvent1,3732584:doSendAllAsync,[(340,97)(340,76)(200,76)(200,139)])
link(onEvent2,11786265:doPush,[(459,104)(459,132)])
}
Add(StrList,13456184,154,91)
{
Strings=#15:HTTP/1.1 200 OK|19:Server: nginx/1.2.1|23:Content-Type: text/html|17:Content-Length: 0|0:|0:|
}
Add(Stack,11786265,532,126)
{
link(onPop,13568669:doEvent1,[])
}

Редактировалось 1 раз(а), последний 2018-08-31 17:36:15
карма: 0

0
Ответов: 4621
Рейтинг: 746
#227: 2018-08-31 17:49:14 ЛС | профиль | цитата
Neo писал(а):
сразу всем, и тем соединениям которые ще не успели передать данные?
Такое вполне возможно - потому как "асинхронно" и принимаем и отправляем. Вероятно, нужно дожидаться прихода данных от каждого соединения, а затем отправлять ответ только этому соединению.
карма: 26

0
Ответов: 704
Рейтинг: 7
#228: 2018-08-31 18:14:44 ЛС | профиль | цитата
Netspirit, очень благодарен за такой "волшебный пендель". Пробовал массу вариаций с адресной отправкой по id соединения, но было еще хуже (появлялись неотвеченные соединения), пока не защитил их мьютексом.
Add(SafeMode,13933790,420,133)
{
Name="InServ1"
Wait_Abandoned=0
WaitMode=1
link(onSafeMode,9234107:doEvent,[])
}
Add(SafeMode,6331467,315,91)
{
Name="InServ1"
Wait_Abandoned=0
link(onSafeMode,15949828:doSplit,[])
}
Add(Switch,14987715,476,91)
{
DataOn=Integer(0)
DataOff=Integer(1)
Default=0
Point(State)
Point(doOn)
}
Add(IndexToChanel,9234107,476,133)
{
Point(Index)
link(onEvent1,11786265:doPop,[])
link(Index,14987715:State,[])
}
Add(Timer,5337033,371,133)
{
Interval=50
Enable=1
link(onTimer,13933790:doSafeMode,[])
AddHint(5,47,27,13,Interval)
AddHint(-79,18,40,13,Enable)
}
Add(Hub,5008916,91,35)
{
OutCount=4
link(onEvent2,3732584:doStartServer,[(193,48)(193,104)])
}
Add(Hub,13568669,581,133)
{
OutCount=4
link(onEvent1,14987715:doReset,[(606,139)(606,83)(466,83)(466,104)])
link(onEvent4,14987715:doOn,[(606,160)(606,174)(466,174)(466,111)])
}
Add(TCPServer,3732584,210,91)
{
Port=234
AsyncEvents=1
OverSend=1
Point(onSend)
Point(onErrorSend)
Point(onErrorStart)
Point(doSendAll)
Point(doSendAsync)
Point(doSendAllAsync)
Point(doCloseAll)
link(onReceive,14574088:doString,[])
link(Data,13456184:Text,[(216,82)(146,82)(146,145)(160,145)])
link(ClientID,15949828:Left,[(223,75)(307,75)(307,173)(370,173)])
AddHint(79,95,37,13,AsyncEvents)
}
Add(FormatStr,14574088,266,91)
{
Mask="%1#%2"
link(onFString,6331467:doSafeMode,[])
link(Str1,3732584:CurClientID,[(272,82)(251,82)(251,159)(223,159)])
}
Add(StrList,13456184,154,91)
{
Strings=#15:HTTP/1.1 200 OK|19:Server: nginx/1.2.1|23:Content-Type: text/html|17:Content-Length: 0|0:|0:|
}
Add(Stack,11786265,525,126)
{
link(onPop,13568669:doEvent1,[])
}
Add(StrPart,15949828,364,91)
{
Char="#"
DirectEvent=0
Point(Left)
link(onSplit,11786265:doPush,[(459,97)(459,132)])
link(onPart,3732584:doSendAsync,[(403,104)(403,69)(200,69)(200,132)])
}


--- Добавлено в 2018-08-31 18:48:18

А можно бы добавить еще асинхронное разрывание указанного соединения?

Редактировалось 2 раз(а), последний 2018-08-31 18:48:18
карма: 0

0
Ответов: 4621
Рейтинг: 746
#229: 2018-09-03 10:39:43 ЛС | профиль | цитата
А как это "асинхронное разрывание"? Чем оно отличается от существующего?
карма: 26

0
Ответов: 704
Рейтинг: 7
#230: 2018-09-03 10:46:41 ЛС | профиль | цитата
Если разрывать от события onReceive (ответвление после мьютекса), то прием следующих данных подвисает. Я так понимаю отличия такие же как и отличия doSend от doSendAsync, но могу ошибаться. Или можно закрывать просто через компонент Thread?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#231: 2018-09-03 12:02:58 ЛС | профиль | цитата
Neo писал(а):
Если разрывать от события onReceive
А пока событие onReceive одного соединения не отработает, от второго - не поступит. Разрыв соединения, по идеи, быстрая операция, событию onReceive мешать не должно. Может, у тебя на onDisconnect громоздкая обработка?
карма: 26

0
Ответов: 704
Рейтинг: 7
#232: 2018-09-03 22:13:57 ЛС | профиль | цитата
Netspirit, это я для сервера прошу, верно? onDisconnect есть только у клиента.
карма: 0

0
Ответов: 4621
Рейтинг: 746
#233: 2018-09-04 12:15:04 ЛС | профиль | цитата
Та да. А onClientDisconnect для чего у сервера?
карма: 26

0
Ответов: 704
Рейтинг: 7
#234: 2018-09-05 00:57:57 ЛС | профиль | цитата
В общем сессию приходится завершать, отправляя клиенту с севера ответ 200 и он отключается сам. Если просто разрывать, то это замедляет работу. Думал может асинхронное разрывание поможет. Ну ладно, не критично. Знаю в php есть функция flush() чтоб корректно завершить сессию, это, кстати, не аналог doClose?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#235: 2018-09-05 11:02:08 ЛС | профиль | цитата
PHP flush(), вроде, не имеет отношения к закрытию сокета. Эта функция просто управляет буфером вывода PHP (форсирует отправку клиенту буферизованных данных). В doClose для этого используется функция shutdown(), потом closesocket(). В PHP аналог - socket_shutdown() и socket_close ().

Я так понимаю, вызов doClose приводит к некоей задержке вызвавшего потока? Я показывал видео стресс-теста компонентов, где по нажатию "Отлючить всех" в сервере 1500 соединений отключаются практически за секунду. Не вижу никаких задержек именно в компонентах.

Редактировалось 1 раз(а), последний 2020-12-21 12:03:32
карма: 26

0
Ответов: 85
Рейтинг: 0
#236: 2020-03-26 09:57:45 ЛС | профиль | цитата
Замечательный альтернативный сервер. Но не получается корректно вывести принятую информацию из концоли для дальнейшего использования. Читал, что над использовать компонент WinExec. взял из примеров как его использовать. могу выбрать первую строку и концоль закрывается с ошибкой сервера. Как сделать чтоб постоянно вытаскивать принятую информацию из концоли?? К сожалению я на работе не могу пока код выслать, что я там наваял.....
карма: 0

0
Ответов: 4621
Рейтинг: 746
#237: 2020-04-01 12:26:41 ЛС | профиль | цитата
"Из консоли" - это из примеров к компонентам? А зачем её вытаскивать из консоли? У компонентов есть событие onReceive - именно с него поступают принимаемые данные. Кроме того, там же есть и неконсольные примеры.

Редактировалось 1 раз(а), последний 2020-04-01 12:27:30
карма: 26

0
Ответов: 59
Рейтинг: 0
#238: 2020-12-18 21:16:18 ЛС | профиль | цитата
А как бы серверную версию разместить в автозагрузку сервера, чтобы серверная часть запускалась без входа в систему на сервере? Я так понимаю для этого уже нужно создать службу?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#239: 2020-12-21 12:05:27 ЛС | профиль | цитата
Да. Сам компонент в службе - работает (должен).
карма: 26

0
Ответов: 203
Рейтинг: 2
#240: 2021-09-17 01:09:29 ЛС | профиль | цитата
Можно сделать Таймаут точкой что бы менять значение ?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)