1С + работа с сокетами #433524


#0 by maxim_ro
Всем привет! Есть проблема которую не могу уже решить n - ный день. Имеется посттерминал, обращение к которому ведется посредством TCP-IP протокола. Описание протокола у меня есть. Нужно прикрутить его к 1С 7.7. Нашел 4 метода для организации работы 1С с сокетами но вот проблема в том ни одна из компонент не может получить данные от посттерминала. Думал может терминал не возвращает ответ, для тестирования компонент скачал утилиту NetCat которую запускаю в режиме сервера (nc –l –p 2000, слушаю порт 2000) и на ней тестирую работоспособность компонент. Опробовал такие компоненты и результаты: •    Внешняя компонента LRC_TCP.dll (версия 1.0.0.0), раз через раз подключалась, данные полученные от сервера должны были обрабатываться процедурой ОбработкаВнешнегоСобытия. Работала криво и под конец тестирования она напрочь отказалась работать.  Не подходит •    Внешняя компонента netaInet.dll (версия 1.0.0.4) данные отправляет нормально но почему то не принимает. Для приема данных в глобальном модуле есть процедура Ответ(Стр) Экспорт. Если данные отправлять без ожидания ответа тогда срабатывает если с ожиданием ответа то иногда сообщение отправляется но в ответ ничего не приходит или же просто данные не отправляются. Так же для работы компоненты необходимо наличие констант ПолучатьОтвет и ЖдатьСоединения они у меня установлены в значения 5 и 4 соответственно. Подходит если разобраться с приемом данных •    Внешняя компонента RiK_Inet.dll (версия 1.0.0.0) компонента вроде как продолжение netaInet.dll но почему то когда она отправляет данные она еще добавляет служебную информацию (размер отправленных данных) и опять же не принимает данные. Для получения данных от сервера (то есть от посттерминала) в глобальном модуле есть процедура Инет_СтрокаОтСервера(Стр) Экспорт но почему не срабатывает. Не подходит. •    ActiveX объект MSWINSCK.OCX (версия 6.0.81.69). Файл взял из поставки Microsoft Visual Basic 6 все остальные версии файла ругались на отсутствие лицензии. Данные отправляет нормально но вот не знаю как принять данные. После того как сервер отправит данные переменная BytesReceived изменяется, а вот процедура GetData почему то всегда возвращает пустое значение. Подходит если разобраться с приемом данных Вот остановился на двох компонентах: netaInet.dll и MSWINSCK.OCX. Больше склоняюсь к последней. Ссобственно и два вопроса: - может кто-нибудь подсказать почему netaInet.dll не отправляет данные когда стоит влаг дожидаться ответа - как используя MSWINSCK.OCX отлавливать получение данных от сервера. Заранее благодарен.
#1 by ТелепатБот
#2 by Serginio1
Кстати у обработки внешнего события ограничение на длину передаваемой строки. Создавал глобальную переменную в которую помещал строку. Напиши сам ВК.
#3 by also
>>Для получения данных от сервера (то есть от посттерминала) в глобальном модуле есть процедура Инет_СтрокаОтСервера(Стр) Экспорт но почему не срабатывает. Все там работает
#4 by H A D G E H O G s
Вау. Не знал. И скока?
#5 by H A D G E H O G s
В самом объекте проще создать возвратное свойтство.
#6 by Serginio1
Разве все и упомнишь. Можно, все равно блокирутся до окончания обработки, т.к. сервер может работать не с одним терминалом. Но уже логика была сделана Данные из ОбработкавнешнегоСобытия, а по сути нет разницы где хранить строку.
#7 by maxim_ro
ну написать свою компоненту идея была но это уже последний вариант, пока что хочется найти ответ на мои вопросы
#8 by maxim_ro
так почему у netaInet может не срабатывать процедура в глобальном модуле Ответ Экспорт =( уже наверное все варианты перепробовал и как с помощью MSWINSCK.OCX в 1С обработать ответ от сервера тоже не понятно
#9 by Sadovnikov
Возьми лучше RiK_Inet. И подавай ей на вход нужную "служебную информацию".
#10 by maxim_ro
про RiK_Inet уже писал выше, отсылает ерунду потому что добавляет системную информацию и данные тоже напрочь не принимает =(
#11 by Sadovnikov
Все она принимает. И отсылает не ерунду, а необходимую для работы информацию.
#12 by maxim_ro
вообще больше склоняюсь к MSWINSCK.OCX, но как отловить прием данных непонятно
#13 by maxim_ro
так про RiK_Inet я ж не придумал, не один день уже играюсь
#14 by maxim_ro
у RiK_Inet когда сервер данные отправляет Процедура Инет_СтрокаОтСервера(Стр) Экспорт ничего не показывает
#15 by Sadovnikov
Отправляешь данные не в том формате.
#16 by maxim_ro
как не в том, что от 1С к серверу строка отправляется и назад от сервера к 1С тоже строку отправляю
#17 by Sadovnikov
Внимательно перечитай свои же слова: "она еще добавляет служебную информацию (размер отправленных данных) "
#18 by maxim_ro
Отправляю строку без пробелов, а в описании компоненты написано что в начало добавляется размер отправленных данных, ну а почему не принимает непонятно
#19 by Sadovnikov
Ты тихо издеваешься, да?
#20 by maxim_ro
может скинуть вам пример кода, я не издеваюсь я уже который день парюсь над этой задачей %)
#21 by Sadovnikov
Вот так она отправляет строку, медитируй: . function TRiK_Inet.SendString(var paParams: PSafeArray{(OleVariant)}) : OleVariant; var      if Active = false then begin
#22 by maxim_ro
так вы принимали участие в ее написании =)) ну подскажите тогда почему когда ОтправитьСтроку(<IPАдрес>, <НомерПорта>, <Сообщение>, 1) процедура в глобальном модуле которая должна обработать ответ от сервера не срабатывает
#23 by Sadovnikov
Я же написал выше - потому что сервер отдает обратно данные не в том формате. Он их дожен отдать так же, как нарисовано в . Данные в другом формате компонента игнорирует.
#24 by maxim_ro
тогда выходит что с помощью компоненты можно связать две конфигурации 1С использующие RiK_Inet или нужно что бы 3-е приложение отправляло данные в нужном формате (в случае с моим посттерминалом невозможно) ?? =(
#25 by Sadovnikov
Почему? Ч одной стороны может быть 1С, а с другой - другое приложение, которое будет формировать нужный протокол общения.
#26 by maxim_ro
а тогда понятно почему не было ответа =( значит RiK_Inet для моего случая точно отпадает, у посттерминала свой формат сообщения =( придется искать другие варианты =(
#27 by Sadovnikov
И совсем нельзя научить терминал послать сообщение в нужном формате?
#28 by maxim_ro
это железяка другой фирмы, начальство принесло мне его и дало задачу связать с 1С, описание протокола мне дали вот и парюсь. А как я понял изготовлен он вообще французами так что лично для меня никто протокол не поменяет =(
#29 by Мутабор
Плагиат, это код Гения1С
#30 by Sadovnikov
Тогда еще шарить по инету. Где-то пробегало, как без ВК (кажись на вбскрипте) работать с сокетами из 1С.
#31 by Sadovnikov
Я опять просто под руку попался?
#32 by maxim_ro
ну шарюсь уже давно вот нашел 4 выше описанных варианта, netaInet тоже получается для данного случая не подходит? она же вроде отправляет просто строку только ответ не приходит у меня лично, как вб скрипт не знаю буду искать но вот MSWINSCK.OCX отправлять отправляет а чтоб получить данные я так понял в 1С событие фиг отловишь %)
#33 by Sadovnikov
Я бы не стал NetaInet юзать... Очень давно писалась, дофига ограничений, есть нестабильность в работе...
#34 by Sadovnikov
+ А в код вообще сейчас стыдно заглядывать...
#35 by maxim_ro
понятно, спасибо за подсказку. LRC_TCP.dll, netaInet.dll, RiK_Inet.dll значит уже отпали для данного варианта буду дальше мучить гугл, а может вдруг кто нить чего подскажет работающего под мой случай
#36 by Мутабор
Ну где же сережа :)))
#37 by Мутабор
+36 он щас подтвердит что этот код он в садике написал, пока на горшочке сидел, а ты стырил :)
#38 by maxim_ro
да неважно кто написал главное что стало понятно почему ответ не приходит в моем случае =)
#39 by Sadovnikov
А, ну да, ну да...
#40 by Serginio1
Обычно клиент посылает данные с заголовком где прописывается длина сообщения, для упрощения считывания итд. Некий свой упрощенный протокол. Написать ВК сервер даже долго не писав на нормальных языкан ну максимум час. Этой ветке уже сутки пойдут. Плюс прими меры для обслуживания одновременно нескольких терминалов. Мне пришлось делать свой протокол по верх UDP, очень плохая связь но я и клиента программировал, по  TCP/IP все элементарно зная протокол клиента.
#41 by maxim_ro
я вот нашел пример как через вбскрипт посылать и принимать данные работает но не совсем то, не знаю или час нужно что бы написать свою компоненту, никогда не пробовал. Поищу примеры может и правда чего нибудь своего напишу =)
#42 by H A D G E H O G s
Я не верю в чудеса.
#43 by H A D G E H O G s
<<Мне пришлось делать свой протокол по верх UDP>> Это ты к тому, что UDP как бы пофигу, дошло ли до адресата цельным сообщение, так?
#44 by Sadovnikov
Это ты о чем?
#45 by Sadovnikov
Понял, отстал :)
#46 by Мутабор
ты чо привязался к челу, ну не хотел он по UDP работать, начал по ICMP, тебе то что?
#47 by H A D G E H O G s
Я не верю в чудо написания компоненты. Автором. За 1 час. Да и за день тоже.
#48 by Serginio1
Да постоянно рвало соединение. Пришлось делать свой протокол с ожиданием ответа. Зато если сервер выключили а тнминал оставили включенным на утро при включении документ прописывался. А на производстве наводок до хрена.
#49 by Serginio1
Это ты зря Берешь   Вот пример правда уже не помню что за вариант. Не рабочий uses begin             if testval<>-1928374650 Then                      except on e:exception do           end      except on e:exception do   end var buf:array of byte; len:Integer; begin  if ClientSocket.Size>ClientSocket.Position then  begin end.
#50 by Serginio1
Ну и сама компонента. Код не вычищаю {$WARN SYMBOL_PLATFORM OFF} interface uses procedure TC1SoccetServer5.SendResult(const StringResult: WideString); begin initialization end.
#51 by maxim_ro
нда за час такое точно не наклепать =)))
#52 by Serginio1
Ты просто не умеешь готовить.  При определенной сноровки да гоовыми решениями ...
#53 by Мутабор
Пля, опть код у Гения украли.
#54 by Serginio1
Мне уже жалко Гения1С, правда не особо то и в курсе, что зесь происходит. Если, что то я ничего у него не крал. Часть кода здесь явно не моя как и комментарии.
#55 by H A D G E H O G s
Еще один бессмысленный оффтопик за тобой замечу - получишь бан.
#56 by H A D G E H O G s
Да если еще знаешь, как отлаживать dll-ки в Дельфи. И еще знаешь про косяк, связанный с этой отладкой в версиях младше 7-ой под платформой NT, да еще как его обходить - вообще сказка.
#57 by Sadovnikov
А что за косяк? У меня шестая дельфя и Win2k. Вроде, ничего такого не замечал.
#58 by Serginio1
Сначала юнит по любому отлаживаешь в составе проекта, это проще. Есть ShowMessage. Это касается и потоков.  Кстати разные версии по разному отлаживаются. Сейчас нет времени, но перейду на 2009, да и на C# 4 с динамиками тоже не плохо.
#59 by H A D G E H O G s
Зачем ShowMessage? Если есть Breakpoints и отладка локальных переменных при отключенной оптимизации проекта.
#60 by H A D G E H O G s
А не отлаживаются dll-ки. Точку останова ставишь - а она - неактивная.
#61 by Мутабор
Раз собрался - бань. Мне пофиг.
#62 by Sadovnikov
О как. А чего тогда у меня отлаживаются? :)
#63 by trdm
Дельфяные не отлаживаются? Помню в 1С++ в отладке сидел без проблем О_о...
#64 by Sadovnikov
Да и в дельфях все отлаживается...
#65 by Бералус
#66 by Бералус
'working   vb code ' Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim sData As String
#67 by Serginio1
С потоками помню мучился.
#68 by Serginio1
На разных версиях семерки по разному Breakpoints отрабатывает при выключенной оптимизации. Та же проблема была и с потоками.
#69 by maxim_ro
пример кода для вб скрипт работает а вот что это за WinsockBytesToString ?? просто так Winsock.GetData(sData,8) ничего не возвращает хотя переменная BytesReceived после отправления данных увеличивается и кеш с данными обнуляется
#70 by maxim_ro
как в 1С отловить событие DataArrival(n) которое происходит в WinSock в момент получения данных %) непонятно, как только разобраться будет решение моей проблемы
#71 by H A D G E H O G s
Полный код напиши
#72 by maxim_ro
#73 by maxim_ro
после отправления данных от сервера переменная Winsock.BytesReceived отображает количество полученных данных но вот метод Winsock.GetData(Ответ) ничего не возвращает
#74 by Бералус
таким способом не удается. и еще по моему средствами 1с невозможна захватить событии от активХ. Вереятность мало , что обращение к WinsockBytesToString нужный момент.(Между прочим -эта произвольная имя) Включи VBscript коды . Или создать новый ВК. Когда надо было употреблять сканнер ШК  в терминальном режиме я выбрал 2-й способ. Могу помочь с ВК.
#75 by Бералус
Если разрывается связь то обращение к ПослатьВинСоксвыдаст сообщение об еррор
#76 by maxim_ro
Winsock.GetData(Ответ,8); такой фрагмент кода получает получает в переменную ответ пустое значение, так я уже пробовал попробую навалять ВК раньше никогда не приходилось, а вы компоненту на чем писали? я ищу примеры под Visual Studio
#77 by Бералус
не уверен, таим способом  удается еще событии от Winsock :  Error,SendComplete,Close который без них почти что не обойдется... Winsock.State -ами это не легко  и не удобно Я на Vb6 писал
#78 by Бералус
#79 by maxim_ro
когда давно, пару лет назад писал на C Builder опыта использования других языков нет =) буду искать примеры и по логике менять под свои нужды %)
#80 by maxim_ro
а у вас имеется пример ВК под Vb ?? =)
#81 by Бералус
Должен А ДЛЛ точно есть
#82 by Бералус
#83 by Бералус
Private Sub Command3_Click Dim s As String s = "erertrt"
#84 by maxim_ro
КонецПроцедуры так я пробовал не работает, возвращает пустое значение
#85 by Бералус
Нашел перекрасный пример ВК на Vsual Studio (исходники на С шарп). Могу передать. И естественно C Builder  подходит для ВК)
#86 by maxim_ro
скиньте пожалуйста пример на maximmro@gmail.com
#87 by Бералус
Пожалуйста...
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям