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

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

Спасибо.
...
Рейтинг: 0 / 0
[gt.m] Работа с сокетом
    #39365020
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valeriu,
Добрый день!
Если под ошибками понимать потерю данных (байтов), то напрашивается вывод, что надо поверх TCP свой протокол писать,
с передачей и проверкой длины пакета, а может и контрольной суммы, с автоповторами.
Я видел это, когда изучал примеры.
После инвалидного пакета выполнялась синхронизация приемника и передатчика (клиента и сервера) с помощью служебного
пакета (кажется 4хFF).
Столкнулся как-то, что клиент получал только часть пакета в 25к, хотя сервер Cache находился на том же самом ПК.
Пока уменьшил длину пакета до 10к, но держу в уме сделать контроль длины пакета:)
...
Рейтинг: 0 / 0
[gt.m] Работа с сокетом
    #39365166
kalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
[gt.m] Работа с сокетом
    #39365167
kalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно выкинуть
Код: plaintext
1.
2.
3.
s qqnump=$j
s qW=##class(%Library.qWORD).%New()
s qARM=##class(%Library.TqARM).%New()
s qqlang=19
...
Рейтинг: 0 / 0
[gt.m] Работа с сокетом
    #39365532
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kalin,

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


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