Имя: Пароль:
1C
 
1С + работа с сокетами
0 maxim_ro
 
23.09.09
17:39
Всем привет!
Есть проблема которую не могу уже решить 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 ТелепатБот
 
гуру
23.09.09
17:39
2 Serginio1
 
23.09.09
17:51
Кстати у обработки внешнего события ограничение на длину передаваемой строки.
Создавал глобальную переменную в которую помещал строку.
Напиши сам ВК.
3 also
 
23.09.09
17:51
>>Для получения данных от сервера (то есть от посттерминала) в глобальном модуле есть процедура Инет_СтрокаОтСервера(Стр) Экспорт но почему не срабатывает.

Все там работает
4 H A D G E H O G s
 
23.09.09
17:58
(2) Вау. Не знал.
И скока?
5 H A D G E H O G s
 
23.09.09
17:59
(2) В самом объекте проще создать возвратное свойтство.
6 Serginio1
 
23.09.09
18:03
Разве все и упомнишь.
Можно, все равно блокирутся до окончания обработки, т.к. сервер может работать не с одним терминалом. Но уже логика была сделана Данные из ОбработкавнешнегоСобытия, а по сути нет разницы где хранить строку.
7 maxim_ro
 
23.09.09
22:50
ну написать свою компоненту идея была но это уже последний вариант, пока что хочется найти ответ на мои вопросы
8 maxim_ro
 
24.09.09
11:02
так почему у netaInet может не срабатывать процедура в глобальном модуле Ответ() Экспорт =( уже наверное все варианты перепробовал
и как с помощью MSWINSCK.OCX в 1С обработать ответ от сервера тоже не понятно
9 Sadovnikov
 
24.09.09
11:06
(8) Возьми лучше RiK_Inet. И подавай ей на вход нужную "служебную информацию".
10 maxim_ro
 
24.09.09
11:11
про RiK_Inet уже писал выше, отсылает ерунду потому что добавляет системную информацию и данные тоже напрочь не принимает =(
11 Sadovnikov
 
24.09.09
11:12
(10) Все она принимает. И отсылает не ерунду, а необходимую для работы информацию.
12 maxim_ro
 
24.09.09
11:12
вообще больше склоняюсь к MSWINSCK.OCX, но как отловить прием данных непонятно
13 maxim_ro
 
24.09.09
11:12
так про RiK_Inet я ж не придумал, не один день уже играюсь
14 maxim_ro
 
24.09.09
11:13
у RiK_Inet когда сервер данные отправляет Процедура Инет_СтрокаОтСервера(Стр) Экспорт ничего не показывает
15 Sadovnikov
 
24.09.09
11:17
(14) Отправляешь данные не в том формате.
16 maxim_ro
 
24.09.09
11:20
как не в том, что от 1С к серверу строка отправляется и назад от сервера к 1С тоже строку отправляю
17 Sadovnikov
 
24.09.09
11:23
(16) Внимательно перечитай свои же слова: "она еще добавляет служебную информацию (размер отправленных данных) "
18 maxim_ro
 
24.09.09
11:25
Отправляю строку без пробелов, а в описании компоненты написано что в начало добавляется размер отправленных данных, ну а почему не принимает непонятно
19 Sadovnikov
 
24.09.09
11:27
(18) Ты тихо издеваешься, да?
20 maxim_ro
 
24.09.09
11:28
может скинуть вам пример кода, я не издеваюсь я уже который день парюсь над этой задачей %)
21 Sadovnikov
 
24.09.09
11:28
(18) Вот так она отправляет строку, медитируй:
.
//*****************************************************************
//ОтправитьСтроку(<IPАдрес>, <НомерПорта>, <Сообщение>, <ОжидатьОтвета>)
//*****************************************************************
function TRiK_Inet.SendString(var paParams: PSafeArray{(OleVariant)}) : OleVariant;
var
 SocKlient : PListSocKlientsRec;
 EndTime   : TDateTime;
 StrOut    : String; //Строка для отправки
 TempInt   : Integer;
 MemSt     : TMemoryStream;
 Wait      : Integer;
begin
 New(SocKlient);
 SocKlient^.SocketClient := TClientSocket.Create(nil);
 SocKlient^.LenString    := 0;
 SocKlient^.LenFile      := 0;
 SocKlient^.FileName     := '';
 SocKlient^.ReadStr      := '';

 try
   With SocKlient^.SocketClient do begin
     //Присвоили процедуры обработки событий
     OnRead  := ClientReadInfoFromServer;
     OnError := ClientErrorOnClient;

     Host := GetNParam(paParams,0);
     Port := GetNParam(paParams,1);

     Open;

     //Попытаемся дождаться соединения
     EndTime := Time + 300*0.000012; //Вроде, должно получиться 5 минут
     while (Active = false) And (Time < EndTime) do begin
       Socket.Lock;
       if Socket.Data <> nil then begin
         Socket.Unlock;
         break;
       end;

       Socket.Unlock;
       sleep(20);
       Application.ProcessMessages;
     end;

     if Active = false then begin
       Free;
       Dispose(SocKlient);

       //Пусть поругается 1С
       if fShowErrorMessages then
         obj.ExecuteBatch('Message("Произошла ошибка при подключении удаленного сервера","!!!")');
       SendString := 0;
       exit;
     end;

     StrOut := GetNParam(paParams,2);
     MemSt  := TMemoryStream.Create;

     TempInt := 1;
     MemSt.WriteBuffer(TempInt, 4);        //Признак, что отправляется строка

     TempInt := 0;
     MemSt.WriteBuffer(TempInt, 4);        //Длина расширения файла. В нашем случае 0

     TempInt := Length(StrOut);
     MemSt.WriteBuffer(TempInt, 4);        //Длина строки

     MemSt.WriteBuffer(StrOut[1], TempInt);

     MemSt.Position := 0;
     if Socket.SendStream(MemSt) = false then begin  //Почему-то не удалось отправить строку
       SocKlient^.SocketClient.Free;
       Dispose(SocKlient);
       SendString := 0;
       exit;
     end;

     Wait := GetNParam(paParams,3);

     //Если не будет ответа, то отключимся и уничтожимся
     if Wait = 0 then begin
       Close;
       SocKlient^.SocketClient.Free;
       Dispose(SocKlient);
       SendString := 1;
       exit;
     end;
   end;

   ListSocKlients.Add(SocKlient);
 except
   SocKlient^.SocketClient.Free;
   Dispose(SocKlient);
   SendString := 0;
   exit;
 end;

 SendString := 1;
end;
//*****************************************************************
22 maxim_ro
 
24.09.09
11:33
так вы принимали участие в ее написании =))
ну подскажите тогда почему когда ОтправитьСтроку(<IPАдрес>, <НомерПорта>, <Сообщение>, 1) процедура в глобальном модуле которая должна обработать ответ от сервера не срабатывает
23 Sadovnikov
 
24.09.09
11:36
(22) Я же написал выше - потому что сервер отдает обратно данные не в том формате. Он их дожен отдать так же, как нарисовано в (21).
Данные в другом формате компонента игнорирует.
24 maxim_ro
 
24.09.09
11:40
тогда выходит что с помощью компоненты можно связать две конфигурации 1С использующие RiK_Inet или нужно что бы 3-е приложение отправляло данные в нужном формате (в случае с моим посттерминалом невозможно) ?? =(
25 Sadovnikov
 
24.09.09
11:43
(24) Почему? Ч одной стороны может быть 1С, а с другой - другое приложение, которое будет формировать нужный протокол общения.
26 maxim_ro
 
24.09.09
11:44
а тогда понятно почему не было ответа =( значит RiK_Inet для моего случая точно отпадает, у посттерминала свой формат сообщения =(
придется искать другие варианты =(
27 Sadovnikov
 
24.09.09
11:46
(26) И совсем нельзя научить терминал послать сообщение в нужном формате?
28 maxim_ro
 
24.09.09
11:48
это железяка другой фирмы, начальство принесло мне его и дало задачу связать с 1С, описание протокола мне дали вот и парюсь. А как я понял изготовлен он вообще французами так что лично для меня никто протокол не поменяет =(
29 Мутабор
 
24.09.09
11:48
(21) Плагиат, это код Гения1С
30 Sadovnikov
 
24.09.09
11:49
(28) Тогда еще шарить по инету. Где-то пробегало, как без ВК (кажись на вбскрипте) работать с сокетами из 1С.
31 Sadovnikov
 
24.09.09
11:49
(29) Я опять просто под руку попался?
32 maxim_ro
 
24.09.09
11:52
ну шарюсь уже давно вот нашел 4 выше описанных варианта, netaInet тоже получается для данного случая не подходит? она же вроде отправляет просто строку только ответ не приходит у меня лично, как вб скрипт не знаю буду искать но вот MSWINSCK.OCX отправлять отправляет а чтоб получить данные я так понял в 1С событие фиг отловишь %)
33 Sadovnikov
 
24.09.09
11:55
(32) Я бы не стал NetaInet юзать... Очень давно писалась, дофига ограничений, есть нестабильность в работе...
34 Sadovnikov
 
24.09.09
11:56
+(33) А в код вообще сейчас стыдно заглядывать...
35 maxim_ro
 
24.09.09
11:57
понятно, спасибо за подсказку. LRC_TCP.dll, netaInet.dll, RiK_Inet.dll значит уже отпали для данного варианта
буду дальше мучить гугл, а может вдруг кто нить чего подскажет работающего под мой случай
36 Мутабор
 
24.09.09
11:58
(31) Ну где же сережа :)))
37 Мутабор
 
24.09.09
11:59
+36 он щас подтвердит что этот код он в садике написал, пока на горшочке сидел, а ты стырил :)
38 maxim_ro
 
24.09.09
12:00
да неважно кто написал главное что стало понятно почему ответ не приходит в моем случае =)
39 Sadovnikov
 
24.09.09
12:08
(37) А, ну да, ну да...
40 Serginio1
 
24.09.09
12:31
(7) Обычно клиент посылает данные с заголовком где прописывается длина сообщения, для упрощения считывания итд. Некий свой упрощенный протокол.
Написать ВК сервер даже долго не писав на нормальных языкан ну максимум час.
Этой ветке уже сутки пойдут.
Плюс прими меры для обслуживания одновременно нескольких терминалов.
Мне пришлось делать свой протокол по верх UDP, очень плохая связь но я и клиента программировал, по  TCP/IP все элементарно зная протокол клиента.
41 maxim_ro
 
24.09.09
12:56
я вот нашел пример как через вбскрипт посылать и принимать данные работает но не совсем то, не знаю или час нужно что бы написать свою компоненту, никогда не пробовал. Поищу примеры может и правда чего нибудь своего напишу =)
42 H A D G E H O G s
 
24.09.09
13:18
Я не верю в чудеса.
43 H A D G E H O G s
 
24.09.09
13:19
(40) <<Мне пришлось делать свой протокол по верх UDP>>
Это ты к тому, что UDP как бы пофигу, дошло ли до адресата цельным сообщение, так?
44 Sadovnikov
 
24.09.09
13:19
(42) Это ты о чем?
45 Sadovnikov
 
24.09.09
13:20
(43) Понял, отстал :)
46 Мутабор
 
24.09.09
13:21
(43) ты чо привязался к челу, ну не хотел он по UDP работать, начал по ICMP, тебе то что?
47 H A D G E H O G s
 
24.09.09
13:28
(45) Я не верю в чудо написания компоненты.
Автором.
За 1 час.
Да и за день тоже.
48 Serginio1
 
24.09.09
13:29
(43) Да постоянно рвало соединение. Пришлось делать свой протокол с ожиданием ответа. Зато если сервер выключили а тнминал оставили включенным на утро при включении документ прописывался. А на производстве наводок до хрена.
49 Serginio1
 
24.09.09
13:40
(47) Это ты зря
Берешь http://1c.proclub.ru/modules/mydownloads/personal.php?cid=115&lid=2019  
Вот пример правда уже не помню что за вариант. Не рабочий

unit TreadClient;

interface

uses
 windows, ActiveX,scktcomp, SysUtils, Classes,AddInLib,SyncObjs;

type
 EServerThread = class( Exception );
 // serverthread это потомок TServerClientThread

 TServerThread = class( TServerClientThread )
   private
     fSocketStream : TWinSocketStream;
   public
   event : Tevent;
   ResultString:String;
     procedure ClientExecute; override;
     // ClientExecute отменяет
     // TServerClientThread.ClientExecute
     // и содержит код, который
     // выполняется при старте потока
     constructor Create(CreateSuspended: Boolean;
 ASocket: TServerClientWinSocket;PEvent:IAsyncEvent;pconn:Olevariant); overload;
      function ReadInteger(Stream:TWinSocketStream):Integer;
     function ReadString(Stream:TWinSocketStream):string;
     procedure WriteInteger(ClientSocket:TServerClientWinSocket; int:Integer); overload;
     procedure WriteString(ClientSocket:TServerClientWinSocket; str:string); overload;
     procedure WriteInteger(ClientSocket:TWinSocketStream; int:Integer); overload;
     procedure WriteString(ClientSocket:TWinSocketStream; str:string);  overload;
     procedure clearBuffer(ClientSocket:TWinSocketStream);
 public
      PEvent:IAsyncEvent;
      Pconn:Olevariant;
     end;

implementation

procedure TServerThread.ClientExecute;
var s,TempStr:string;
len:Integer;
Testval:Integer;
appdisp:Olevariant;
begin

 inherited FreeOnTerminate := TRUE;
 CoInitialize(nil);

  tempstr:='';
   event := TEvent.Create(nil, True, False, '');




    fSocketStream := TWinSocketStream.Create( ClientSocket,20000);

   // 100000 - это таймаут в миллисекундах.
   try
     while ( not Terminated ) and ( ClientSocket.Connected ) do
      Begin
       // В это место обычно помещается код,
       // ожидающий входных данных, читающий из сокета или пишущий в него
       // Пример, приведённый ниже, показывает, что можно добавить в данную
       // секцию программы.
       // создаем поток для текущего сокет-соединения
 // задаем таймаут ожидания равным 20 сек.
      try
        if   fSocketStream.WaitForData( 20000 )  then
         begin
 // Обработчик таймаута (т.е. если по истечении 1000000 миллисекунд
 // от клиента не пришло запроса
            len:=fSocketStream.Read(testval,sizeof(testval));
            if len<4 Then
            begin
 //           appdisp.WriteDoc('передано '+intToStr(len)+'байт',DateTimeToStr(now));

            break
            end;

            if testval<>-1928374650 Then
            begin
//             appdisp.WriteDoc('передано значение'+intToStr(testval)+#13#10'размер стрима '+inttostr(fSocketStream.Size),DateTimeToStr(now));
           // clearBuffer(fSocketStream);
            break
            end;
                try
                   S:=ReadString(fSocketStream);
                     except on e:exception do
                      begin
                        PEvent.ExternalEvent('Socket1C','Отладка','Ошибка чтения');
                        WriteString(fSocketStream,'Ошибка чтения');
                        break
                      end;
                   end;

                 //   PEvent.ExternalEvent('Socket1C','Отладка','отсылаем строку');

                      if Length(s)>100 then
                      begin
                        appdisp:=Pconn.Appdispatch;
                        idispatch(appdisp)._AddRef;
                         appdisp.СтрокаИзСоккета:=s;
                         PEvent.ExternalEvent('Socket1C',ClientSocket.RemoteAddress,'"ПолучитьДанныеИЗстрокиИзСоккета"');
                      end
                      else
                      PEvent.ExternalEvent('Socket1C',ClientSocket.RemoteAddress,s);


                   //        PEvent.ExternalEvent('Socket1C','Отладка','Ждем ответа');
                //  TempStr:=appdisp.GetstringFromSocket(s);
                  event.waitfor(infinite);
                     //      PEvent.ExternalEvent('Socket1C','Отладка','Получили ответ');

                  TempStr:=ResultString;
                   WriteString(fSocketStream,TempStr);
                    break;

          end
     except on e:exception do
       begin
         // Если произошла ошибка, то закрываем сокет и выходим
          fSocketStream.Free;
          fSocketStream:=nil;
   //  PEvent.ExternalEvent('Socket1C','free',s);
     ClientSocket.Close;
     event.free;
    // CoInitialize(nil);
       end
      end
     end
   finally
     fSocketStream.Free;
   //  PEvent.ExternalEvent('Socket1C','free',s);
     ClientSocket.Close;
     CoUnInitialize();
     Terminate;
   end;

end;

//Когда связь установлена, потоку необходимо ожидать входящих данных(запроса от клиента). Для этого можно использовать следующий код:

//if ( not Terminated ) and
//   ( not fSocketStream.WaitForData( 1000000 ) ) then
//begin
 // Обработчик таймаута (т.е. если по истечении 1000000 миллисекунд
 // от клиента не пришло запроса
//end;
// В сокете есть входящие данные!

//Для чтения данных, Вам понадобится создать буфер для хранения полученных данных. Обычно буфер - это PByteArray или массив символов. В этом примере я обозвал буфер как fRequest который является массивом символов. Кроме того я ожидаю фиксированное количество байт. Массив имеет постоянный размер REQUESTSIZE.

//var
// ac, readlen : integer;
//begin
//  FillChar( fRequest, REQUESTSIZE, 0 );
//  ac := 0;
//  repeat
//    readlen := fSocketStream.Read( fRequest[ac],
//                                  1024 );
   // считываем блоки по 1024 байт, до тех пор, пока буфер
   // не заполнится
//    ac := ac+readlen;
//  until ( readlen = 0 ) or ( ac = REQUESTSIZE );
//end;

//Если readlen равно 0, значит больше нет входящих данных. Функция Чтения завершается через 100000 миллисекунд после запуска в TWinSocketStream.Create(). Если Вы не знаете сколько времени нужно ожидать запроса от клиента, то чем меньше будет таймаут, тем лучше. В большинстве случаев максимальный таймаут не должен превышать 30 секунд.

//При посылке ответа, Вы должны знать, в каком режиме работает клиент. Многие клиенты ожидают только один пакет ответа, другие ожидают несколько пакетов. В этом примере, я подразумеваю клиента, который ожидает только один пакет, так что я должен послать мои данные назад в одном блоке:

//fSocketStream.WriteBuffer( fRep, fReplySize );

//fRep это буфер, содержащий ответ на запрос клиента, и fReplySize - это размер буфера.

constructor TServerThread.Create(CreateSuspended: Boolean;
 ASocket: TServerClientWinSocket; PEvent: IAsyncEvent;pconn:Olevariant);
begin
  self.PEvent:=PEvent;
  self.pconn:=pconn;
  inherited Create(CreateSuspended,ASocket);
end;

function TServerThread.ReadInteger(Stream:TWinSocketStream): Integer;
  var res:Integer;
begin
  Stream.Read(res,sizeOf(result));
 result:=res;
end;

function TServerThread.ReadString(Stream:TWinSocketStream): string;
var len:Integer;
var StartPos,BytesRead,rb:Integer;
begin
  len:=readInteger(Stream);
//   PEvent.ExternalEvent('Socket1C','Отладка',IntToStr(len));
  Setlength(result,len);
  if len>1024 Then
  begin
   StartPos:=1;
   rb:=1024;
  while (len>0) do
   Begin
    BytesRead:=Stream.Read(result[StartPos],rb);
    dec(len,BytesRead);
    inc(StartPos,BytesRead);
    if rb>len then rb:=len;
   end
  end
  else
  Stream.Read(result[1],len);

  TrimRight(result);

//   PEvent.ExternalEvent('Socket1C','Отладка','прочитали');
end;

procedure TServerThread.WriteInteger(ClientSocket: TServerClientWinSocket;
 int: Integer);
begin
   ClientSocket.SendBuf(int,sizeOf(int));
end;

procedure TServerThread.WriteString(ClientSocket: TServerClientWinSocket; str: string);
var SizeRecive:Integer;
begin
 SizeRecive:=length(str);
 writeInteger(ClientSocket,SizeRecive);
 ClientSocket.SendBuf(str[1],SizeRecive);
end;

procedure TServerThread.WriteInteger(ClientSocket: TWinSocketStream;
 int: Integer);
begin
   ClientSocket.Write(int,sizeOf(int));
end;

procedure TServerThread.WriteString(ClientSocket: TWinSocketStream;
 str: string);
 var SizeRecive:Integer;
begin
  SizeRecive:=length(str);
 writeInteger(ClientSocket,SizeRecive);
 ClientSocket.Write(str[1],SizeRecive);
end;

procedure TServerThread.clearBuffer(ClientSocket: TWinSocketStream);
var buf:array of byte;
len:Integer;
begin
 if ClientSocket.Size>ClientSocket.Position then
 begin
   len:=ClientSocket.Size-ClientSocket.Position;
   setlength(buf,len);
   ClientSocket.Read(buf[0],len)
 end;
end;

end.
50 Serginio1
 
24.09.09
13:46
Ну и сама компонента. Код не вычищаю
unit C1SocketServerUn;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
 ComObj, ActiveX, StdVcl,C1SocketServer_TLB,AddInLib, ScktComp,SysUtils,Classes,TreadClient,dialogs;

type


 TClientDataThread = class(TThread)
private
 public
      PEvent:IAsyncEvent;
      str,RemouteAdress:String;

   constructor Create(CreateSuspended: Boolean;Event:IAsyncEvent;str1,RemouteAdress1:String);
   procedure Execute; override;
   procedure Terminate;
 end;


 TC1SoccetServer5 = class(TAutoObject, IC1SoccetServer5)
 protected
   procedure InitFrom1C(pcon: OleVariant); safecall;
   procedure SendResult(const StringResult: WideString); safecall;
      private
      PEvent:IAsyncEvent;
      pConn :Olevariant;
      SS:TServerSocket;
      CurrentClient:TServerThread;
  procedure   fSocketGetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;  var SocketThread: TServerClientThread);
     public

     destructor Destroy; override;
 end;

implementation

uses ComServ;

destructor TC1SoccetServer5.Destroy;
begin
//showmessage('destroy');
 ss.Close; //Active:=false;
 ss.Free;
 inherited;
end;

procedure TC1SoccetServer5.InitFrom1C(pcon: OleVariant);
var plDepth,res: Integer;
//SL:IStatusLine;

begin


   PEvent := nil;
    res:=IDispatch(pCon).QueryInterface(IAsyncEvent,PEvent);
      PEvent.SetEventBufferDepth(300);

            SS:=TServerSocket.Create(nil);
            ss.Port:=4269;

     ss.ServerType:=stThreadBlocking;
     ss.OnGetThread:=fSocketGetThread;
     ss.Open;

  //    PEvent.ExternalEvent('СобытиеСокета','Подключение','Привет');
      pconn:=pcon;
end;


procedure TC1SoccetServer5.fSocketGetThread(Sender: TObject;
 ClientSocket: TServerClientWinSocket;
 var SocketThread: TServerClientThread);
// var TempServer:TServerThread;
begin
 // Здесь создаём объект TServerThread, который я привожу ниже.
 // Новый объект создаётся каждый раз, когда когда установлен канал связи.
 CurrentClient := TServerThread.Create( true, ClientSocket,PEvent,pconn );
  SocketThread:=CurrentClient;
  SocketThread.Resume;


end;
constructor TClientDataThread.Create(CreateSuspended: Boolean;Event:IAsyncEvent;str1,RemouteAdress1:String);
begin
 inherited Create(CreateSuspended);
 FreeOnTerminate := true;
 PEvent:=event;
 str:=str1;
 RemouteAdress:=RemouteAdress1;
end;

procedure TClientDataThread.Terminate;
begin
  RemouteAdress:='';
  str:='';
 inherited;
end;

procedure TClientDataThread.Execute;
begin
 CoInitialize(nil);
//   showmessage(str);
    PEvent.ExternalEvent('Поступление по сокету',RemouteAdress,str);
CoUninitialize;
end;



procedure TC1SoccetServer5.SendResult(const StringResult: WideString);
begin
CurrentClient.ResultString:=StringResult;
CurrentClient.event.SetEvent;
end;

initialization
 TAutoObjectFactory.Create(ComServer, TC1SoccetServer5, Class_C1SoccetServer5,
   ciMultiInstance, tmApartment);
end.
51 maxim_ro
 
24.09.09
14:07
нда за час такое точно не наклепать =)))
52 Serginio1
 
24.09.09
14:30
(51) Ты просто не умеешь готовить.  При определенной сноровки да гоовыми решениями ...
53 Мутабор
 
24.09.09
14:32
Пля, опть код у Гения украли.
54 Serginio1
 
24.09.09
15:11
(53) Мне уже жалко Гения1С, правда не особо то и в курсе, что зесь происходит.
Если, что то я ничего у него не крал. Часть кода здесь явно не моя как и комментарии.
55 H A D G E H O G s
 
модератор
24.09.09
15:14
(53) Еще один бессмысленный оффтопик за тобой замечу - получишь бан.
56 H A D G E H O G s
 
24.09.09
15:17
(52) Да если еще знаешь, как отлаживать dll-ки в Дельфи.
И еще знаешь про косяк, связанный с этой отладкой в версиях младше 7-ой под платформой NT, да еще как его обходить - вообще сказка.
57 Sadovnikov
 
24.09.09
15:21
(56) А что за косяк? У меня шестая дельфя и Win2k. Вроде, ничего такого не замечал.
58 Serginio1
 
24.09.09
15:27
(56) Сначала юнит по любому отлаживаешь в составе проекта, это проще.
Есть ShowMessage. Это касается и потоков.  Кстати разные версии по разному отлаживаются.
Сейчас нет времени, но перейду на 2009, да и на C# 4 с динамиками тоже не плохо.
59 H A D G E H O G s
 
24.09.09
15:40
(58) Зачем
ShowMessage()?
Если есть Breakpoints и отладка локальных переменных при отключенной оптимизации проекта.
60 H A D G E H O G s
 
24.09.09
15:41
(57) А не отлаживаются dll-ки.
Точку останова ставишь - а она - неактивная.
61 Мутабор
 
24.09.09
15:46
(55) Раз собрался - бань. Мне пофиг.
62 Sadovnikov
 
24.09.09
15:47
(60) О как. А чего тогда у меня отлаживаются? :)
63 trdm
 
24.09.09
15:54
(60) Дельфяные не отлаживаются?
Помню в 1С++ в отладке сидел без проблем О_о...
64 Sadovnikov
 
24.09.09
15:56
(63) Да и в дельфях все отлаживается...
65 Бералус
 
24.09.09
15:56
// Winsock1 ActiveX object (MSWINSCK.OCX)
// 8==vbString
// не тестировал
Функция WinsockBytesToString(Winsock,bytesTotal )
Var sData;
sData="";
//Winsock.GetData(sData,8,bytesTotal);
Winsock.GetData(sData,8);
возврат sData;
Конецфункци
66 Бералус
 
24.09.09
15:58
'working   vb code
'
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim sData As String
Winsock1.GetData , sData, vbString
msgbox sData
End Sub
67 Serginio1
 
24.09.09
16:04
(59) С потоками помню мучился.
68 Serginio1
 
24.09.09
16:06
(60) На разных версиях семерки по разному Breakpoints отрабатывает при выключенной оптимизации. Та же проблема была и с потоками.
69 maxim_ro
 
24.09.09
16:28
пример кода для вб скрипт работает а вот что это за WinsockBytesToString ??
просто так Winsock.GetData(sData,8) ничего не возвращает хотя переменная
BytesReceived после отправления данных увеличивается и кеш с данными обнуляется
70 maxim_ro
 
24.09.09
16:35
как в 1С отловить событие DataArrival(n) которое происходит в WinSock в момент получения данных %) непонятно, как только разобраться будет решение моей проблемы
71 H A D G E H O G s
 
24.09.09
17:05
(70) Полный код напиши
72 maxim_ro
 
24.09.09
17:11
создание объекта
Процедура ПодключитьВинСокс()
   Попытка
       Winsock = СоздатьОбъект("MSWinsock.Winsock");
   Исключение
       Сообщить(ОписаниеОшибки());        
       Возврат;
   КонецПопытки;
   
   Сообщить("Подключение...");
   Winsock.Connect(СокрЛП(ВыбХост), Порт);
   Сообщить(Winsock.State);
   Пока Winsock.State <> 7 Цикл //ждем пока подключится
       Если Winsock.State = 9 Тогда //если ошибка
           Сообщить("ошибка сокета");
           Возврат;
       КонецЕсли;    
   КонецЦикла;    
   Сообщить(Winsock.RemoteHostIP);
КонецПроцедуры

отправление данных
Процедура ПослатьВинСокс()
   Сообщить("Отправляем данные..");
   Winsock.SendData(СокрЛП(ВыбМеседжВинСокс));
КонецПроцедуры
73 maxim_ro
 
24.09.09
17:12
после отправления данных от сервера переменная Winsock.BytesReceived отображает количество полученных данных но вот метод Winsock.GetData(Ответ) ничего не возвращает
74 Бералус
 
24.09.09
18:08
(72) таким способом не удается. и еще по моему средствами 1с (7) невозможна захватить событии от активХ. Вереятность мало , что обращение к WinsockBytesToString нужный момент.(Между прочим -эта произвольная имя)
Включи VBscript коды . Или создать новый ВК. Когда надо было употреблять сканнер ШК  в терминальном режиме я выбрал 2-й способ.
(73)

//Если Winsock.BytesReceived>0 тогда

Ответ="что то";
Winsock.GetData(Ответ,8);

// или
//Ответ= WinsockBytesToString(Winsock,Winsock.BytesReceived)

// тутже уже Winsock.BytesReceived==0

сообщить(Ответ);// Ответ уже не "что то"

//КонецЕсли;
Могу помочь с ВК.
75 Бералус
 
24.09.09
18:12
Если разрывается связь то обращение к ПослатьВинСокс()выдаст сообщение об еррор
76 maxim_ro
 
24.09.09
18:17
Если Winsock.BytesReceived>0 тогда  
Ответ="что то";
Winsock.GetData(Ответ,8);
такой фрагмент кода получает получает в переменную ответ пустое значение, так я уже пробовал
попробую навалять ВК раньше никогда не приходилось, а вы компоненту на чем писали? я ищу примеры под Visual Studio
77 Бералус
 
24.09.09
18:19
(76) не уверен, таим способом  удается еще событии от Winsock :  Error,SendComplete,Close который без них почти что не обойдется...
Winsock.State -ами это не легко  и не удобно
Я на Vb6 писал
78 Бералус
 
24.09.09
18:20
пусть попробую
Ответ="что то";
Winsock.GetData(Ответ,8);
79 maxim_ro
 
24.09.09
18:23
когда давно, пару лет назад писал на C Builder
опыта использования других языков нет =) буду искать примеры и по логике менять под свои нужды %)
80 maxim_ro
 
24.09.09
18:30
а у вас имеется пример ВК под Vb ?? =)
81 Бералус
 
24.09.09
18:32
Должен А ДЛЛ точно есть
82 Бералус
 
24.09.09
18:38
Согласен, не реагирует
Перем Winsock;  
 процедура яяя()  
     Если Winsock.BytesReceived>0 тогда  
   Ответ="";
   Winsock.GetData(Ответ);
   сообщить(Ответ);
   иначе сообщить("BytesReceived=0");
   конецЕсли;
 КонецПроцедуры
 
Процедура ПодключитьВинСокс()
   Попытка
       Winsock = СоздатьОбъект("MSWinsock.Winsock");
   Исключение
       Сообщить(ОписаниеОшибки());        
       Возврат;
   КонецПопытки;
   
   Сообщить("Подключение...");
   Winsock.RemoteHost ="192.168.1.2";
   
Winsock.RemotePort=21;
  Winsock.Connect();//(СокрЛП("192,168,1,2"), 21);
   Сообщить(Winsock.State);
   Пока Winsock.State <> 7 Цикл //ждем пока подключится
       Если Winsock.State = 9 Тогда //если ошибка
           Сообщить("ошибка сокета");
           Возврат;
       КонецЕсли;    
   КонецЦикла;    
   Сообщить(Winsock.RemoteHostIP); //яяя()  ;
   
КонецПроцедуры

//отправление данных
Процедура ПослатьВинСокс()
   Сообщить("Отправляем данные..");
//    Winsock.SendData(СокрЛП(ВыбМеседжВинСокс));
КонецПроцедуры
Процедура Сформировать()
      ПодключитьВинСокс();
КонецПроцедуры
83 Бералус
 
24.09.09
18:42
Private Sub Command3_Click()
Dim s As String
s = "erertrt"
'MsgBox " " & Winsock1.BytesReceived & "  " & bytesTotal

Winsock1.GetData s, vbString
MsgBox s

End Sub
работает нормально
84 maxim_ro
 
25.09.09
12:07
Перем Winsock;  
 процедура яяя()  
     Если Winsock.BytesReceived>0 тогда  
   Ответ="";
   Winsock.GetData(Ответ);
   сообщить(Ответ);
   иначе сообщить("BytesReceived=0");
   конецЕсли;
 КонецПроцедуры
так я пробовал не работает, возвращает пустое значение
85 Бералус
 
26.09.09
21:28
(76)Нашел перекрасный пример ВК на Vsual Studio (исходники на С шарп). Могу передать.
(79) И естественно C Builder  подходит для ВК)
86 maxim_ro
 
28.09.09
18:50
скиньте пожалуйста пример на maximmro@gmail.com
87 Бералус
 
30.09.09
11:22
Пожалуйста...