Гость
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gt.m] Работа с сокетом / 7 сообщений из 7, страница 1 из 1
12.12.2016, 12:48
    #39364793
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
Добрый день.

Может кто-то ответит на мой вопрос.
Я раньше как бы работал с сокетом,
но использовал линуксовую службу xinetd,
реже родной gt.m .
В чем собственно вопрос .
Нужно обработать ошибки и если они есть, не остановить
работу сокета (halt), а продолжить его, если потребуется перезапустить заново .
Как это можно реализовать и как это делается в других реализациях М ?

Спасибо.
...
Рейтинг: 0 / 0
12.12.2016, 16:03
    #39365020
DirksDR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
Valeriu,
Добрый день!
Если под ошибками понимать потерю данных (байтов), то напрашивается вывод, что надо поверх TCP свой протокол писать,
с передачей и проверкой длины пакета, а может и контрольной суммы, с автоповторами.
Я видел это, когда изучал примеры.
После инвалидного пакета выполнялась синхронизация приемника и передатчика (клиента и сервера) с помощью служебного
пакета (кажется 4хFF).
Столкнулся как-то, что клиент получал только часть пакета в 25к, хотя сервер Cache находился на том же самом ПК.
Пока уменьшил длину пакета до 10к, но держу в уме сделать контроль длины пакета:)
...
Рейтинг: 0 / 0
12.12.2016, 18:29
    #39365166
kalin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
DirksDR,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
GTMLINK(port)  ;GT.M Link Server - by paulo.rogerio@zipmail.com.br  ; Compiled April 3, 2007 11:16:22
  ;Based on Socket Examples from fscwitte@users.sourceforge.net
  ; NO ^ROUTINE ENTRY
  n ver
  s:port="" port=8000
  s ver=$e($zv,1,10)
    i ver["GT.M" j START^%MLINK(port) q
    i ver["Cache" j srv^%MLINK(port) q
  QUIT
  ;
START(%ZNPort)  ;Start the Server
  ;S %ZNPort=800
  S %ZNDev="SCK$"_$J
  O %ZNDev:(ZLISTEN=%ZNPort_":TCP":NODELIMITER:ATTACH="listener"):60:"SOCKET"
  E  Q
  ; USE fills $KEY with "BOUND|socket_handle|portnumber"
  U %ZNDev
  ;
  ; Start listening, sets $KEY to "LISTENING|socket_handle|portnumber"
  W /LISTEN(1)
  ;
  ; Wait for connection, $KEY will be "CONNECT|socket_handle|remote_ipaddress"
1  ;
  F  D  q:$KEY]""
  . W /WAIT(60)
  . I $KEY]"" Q
  ;
  ; Store the connection socket in local variable,
  S %ZNSock=$piece($KEY,"|",2)
  C %ZNDev:(SOCKET="listener") J START^GTMLINK ;close listener and start another GT.M Link to listen port
  S $ZTRAP="GOTO ERROR^GTMLINK"
2  U %ZNDev:(SOCKET=%ZNSock)
  W "glc_READY:",$c(0)
  ;
  s qqnump=$j
  s qW=##class(%Library.qWORD).%New()
    s qARM=##class(%Library.TqARM).%New()
    s qqlang=1
3  F  D          
  . s %ZNData=$$GETDATA() q:%ZNData=""
  . i %ZNData="" q
  . q:%ZNData=$c(1)
  . I %ZNData="glc_EXIT:" W "glc_DISCONNECTED:",$c(0) s ^tmplink("close",$j)=$h_"~EXIT" C %ZNDev H
  . I $P(%ZNData,":",1)="glc_EXECUTE" D
  .. W $c(1,2,3,4,5,6,7,8,9)
  .. I %ZNData["getsessionid=1" k:$d(^%session($JOB)) ^%session($JOB) s ^%session($JOB)=$h
  .. F %ZTemp=0:1:9 s %Var="P"_%ZTemp,@%Var=$p(%ZNData,$c(1),%ZTemp+2)
  .. S %ZNCommand=$P($P(%ZNData,":",2,9999),$c(1),1)
  .. S:%ZNCommand[($c(5)_"xmldata=1") %ZNCommand=$p(%ZNCommand,$c(5)_"xmldata=1",1)
  .. S P9=""  
  .. X:%ZNData'["getsessionid=1" %ZNCommand
  .. s:%ZNData["getsessionid=1" P0=$JOB
  .. F %ZTemp=0:1:9 S %Var="P"_%ZTemp I '$D(@%Var) S @%Var=""
  .. W "glc_EXRESPONSE:<registry>",P0,$C(1),P1,$C(1),P2,$C(1),P3,$C(1),P4,$C(1),P5,$C(1),P6,$C(1),P7,$C(1),P8,$C(1),P9,$c(1)
  .. W $c(9,8,7,6,5,4,3,2,1)
  s ^tmlink("close",$j)=$h
  C $I
  H
GETDATA()  
        n c,d,end,c1
        S (d,end,c1,c)=""
        d FINDST
        f  d  q:end=1
        .R *c:60 q:'$T
        .S d=d_$C(c)
        .S c1=c1_c
        .s:c1[987654321 d=$p(d,$c(9,8,7,6,5,4,3,2,1),1),end=1
        .q
        s ^tmlink("open",$j)=d
        q d
FINDST  
        n c,end,str
        s (c,end,str)=""
        f  d  q:end=1
        .R *c:60 q:'$T
        .q:(c<1)!(c>9)
        .s str=str_c
        .s:str[123456789 end=1
        .q
        q
ERROR  ;
  W $c(1,2,3,4,5,6,7,8,9)
  F %ZTemp=0:1:9 S %Var="P"_%ZTemp I '$D(@%Var) S @%Var=""
  s ^GTMERROR($j,$h)=$TR($ZSTATUS,$C(13,10),"")
  U %ZNDev:(SOCKET=%ZNSock)
  W "glc_ERROR:"_$TR($ZSTATUS,$C(13,10),""),$C(1),"<registry>",P0,$C(1),P1,$C(1),P2,$C(1),P3,$C(1),P4,$C(1),P5,$C(1),P6,$C(1),P7,$C(1),P8,$C(1),P9,$C(1),$c(9,8,7,6,5,4,3,2,1)
  g 3
sererror
  W $c(1,2,3,4,5,6,7,8,9)
  F %ZTemp=0:1:9 S %Var="P"_%ZTemp I '$D(@%Var) S @%Var=""
  s ^GTMERROR($j,$h)=$ZERROR
  W "glc_ERROR:"_$zerror,$C(1),"<registry>",P0,$C(1),P1,$C(1),P2,$C(1),P3,$C(1),P4,$C(1),P5,$C(1),P6,$C(1),P7,$C(1),P8,$C(1),P9,$C(1),$c(9,8,7,6,5,4,3,2,1),*-3 
  g 4
srv(port)
    n dev,mode,jobflag,id,end
    S dev="|TCP|"_port
 // 4 transfer to job open socket        
   s $zt="error" 
   S mode="AS" 
   s end=""
   S jobflag=4
   O dev:(:port:mode::32767:32767) 
   f  d  q:end=1
   .U dev R x:30 // wait connection
   .i $T J srvj(port):(:jobflag:$IO:$IO):0 s end=1
   .q
error
  c dev  
  j srv^%MLINK(port)
 q
srvj(port)
  n id,in,d,str,dev
  s $zt="sererror"
  s d=""
  W "glc_READY:"_$c(0),*-3  
4 F  D          
  . s %ZNData=$$GETDATA() q:%ZNData=""
  . i %ZNData="" q
  . q:%ZNData=$c(1)
  . I %ZNData="glc_EXIT:" W "glc_DISCONNECTED:",$c(0) s ^tmplink("close",$j)=$h_"~EXIT" H
  . I $P(%ZNData,":",1)="glc_EXECUTE" D
  .. s value=""
  .. W $c(1,2,3,4,5,6,7,8,9)
  .. I %ZNData["getsessionid=1" k:$d(^%session($JOB)) ^%session($JOB) s ^%session($JOB)=$h
  .. F %ZTemp=0:1:9 s %Var="P"_%ZTemp,@%Var=$p(%ZNData,$c(1),%ZTemp+2)
  .. S %ZNCommand=$P($P(%ZNData,":",2,9999),$c(1),1)
  .. S:%ZNCommand[($c(5)_"xmldata=1") %ZNCommand=$p(%ZNCommand,$c(5)_"xmldata=1",1) 
  .. s P9=""
  .. //s:($tr(%ZNCommand," ")'="")&(%ZNData'["getsessionid=1") %ZNCommand=$$GetFunc(%ZNCommand)
  .. d:%ZNData'["getsessionid=1" Ex(.%ZNCommand)
  .. i %ZNData'["getsessionid=1" s ^Aaa("com")=%ZNCommand x %ZNCommand
  .. s:%ZNData["getsessionid=1" P0=$JOB
  .. F %ZTemp=0:1:9 S %Var="P"_%ZTemp I '$D(@%Var) S @%Var=""
  .. W "glc_EXRESPONSE:<registry>",value,$C(1),P0,$C(1),P1,$C(1),P2,$C(1),P3,$C(1),P4,$C(1),P5,$C(1),P6,$C(1),P7,$C(1),P8,$C(1),P9,$c(1)
  .. W $c(9,8,7,6,5,4,3,2,1),*-3 
  ..q
  .q
  Q       
Ex(Cmd)  
  q:Cmd=""
  f  q:($e(Cmd)'=" ")!(Cmd="")  s Cmd=$e(Cmd,2,32000)
  q:Cmd=""
  i $e(Cmd)="$" s Cmd="s value="_Cmd q
  i $e(Cmd)="=" s Cmd="s value"_Cmd q
  q

Работает лет 15 по cache и GT.M

123456789 - пакет вначале передачи

987654321 - в конце

Шлет данные как потоком , так и типа по команде аналога VisM
Отдельно можно передавать и получать регистры от P0 до P9
...
Рейтинг: 0 / 0
12.12.2016, 18:31
    #39365167
kalin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
Можно выкинуть
Код: plaintext
1.
2.
3.
s qqnump=$j
s qW=##class(%Library.qWORD).%New()
s qARM=##class(%Library.TqARM).%New()
s qqlang=19
...
Рейтинг: 0 / 0
13.12.2016, 11:00
    #39365532
DirksDR
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
kalin,

Спасибо, полезный код.
...
Рейтинг: 0 / 0
15.12.2016, 08:48
    #39367336
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
kalin,
У вас правильный почтовый адрес, что указан в профиле ?
...
Рейтинг: 0 / 0
22.12.2016, 10:14
    #39372601
Valeriu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[gt.m] Работа с сокетом
kalin,
Немножко вроде стало ясно.
Еще вопрос.
Нету опыта с новой версии работы СОКЕТА GT.M v 6.2 и выше ?
То что у них, сложновато в примере.
http://tinco.pair.com/bhaskar/gtm/doc/books/pg/UNIX_manual/sockexamplemulti31.m
Вот что не нравится у них, что слишком намудрили с сокетом..
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / [gt.m] Работа с сокетом / 7 сообщений из 7, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]