![]() |
![]() |
![]() |
|
У кого есть реально рабочий пример работы с Winsock? Либо других компонент для TCP. | ☑ | ||
---|---|---|---|---|
0
sezhik
23.05.10
✎
21:49
|
Есть задача обмен с GPRS модемом.
Боролся с Winsock весь инет перерыл. Не могу понять почему нет соединения. Может кто нибудь толкового что то подскажет. ВинСокSrv = Новый ComОбъект("MSWinsock.Winsock"); ВинСокSrv.Protocol = "IPPROTO_TCP"; If ВинСокSrv.State <> 0 Then ВинСокSrv.Close(); EndIF; //ВинСокSrv.LocalIP="127.0.0.1"; //ВинСокSrv.LocalPort = 4997; ВинСокSrv.Bind( 777, "127.0.0.1" ); ВинСокSrv.listen(); If ВинСокSrv.State = 6 Then ВинСокSrv.Accept(0); EndIF; //ВинСокSrv.Accept(0); Сообщить(ВинСокSrv.State); Конекчусь в обратную сторону telnet или putty. Глухо. Висит в статусе 2 (ожидание) |
|||
1
kot_bcc
23.05.10
✎
21:56
|
"ВинСокSrv.Bind( 777, "127.0.0.1" );" -> "ВинСокSrv.Bind(777);"
127.0.0.1 - будет слушать только на 127.0.0.1, т.е. никакой другой, в т.ч., к примеру, "localhost" - не забиндится. Может быть, в этом проблема? |
|||
2
kot_bcc
23.05.10
✎
22:00
|
И кстати, откуда это "Висит в статусе 2 (ожидание)"?
Судя по " If ВинСокSrv.State = 6 Then ВинСокSrv.Accept(0); EndIF; " ничего видно и не должно быть... |
|||
3
sezhik
23.05.10
✎
22:04
|
(1) А по какому тогда адресу должен конектится внешний клиент. По внешнему IP? Или 127.0.0.1
(2) Ну должно при попытке соединения перейти в статус 6 Сообщить(ВинСокSrv.State); отсюда видно. |
|||
4
sezhik
23.05.10
✎
22:06
|
Можно обойтись без bind но тогда winsock видит только внешние IP и конектится видимо нужно только к нему. Но это сути не меняет. я и так и так пробовал.
|
|||
5
Torquader
23.05.10
✎
22:12
|
127.0.0.1 - это для ожидания соединения на локальной машине и только локально.
Можно, не ставить вообще IP - тогда система выберет его сама и какой нужно. У меня как-то проблем с WinSock не возникало. Если очень надо - завтра могу выслать рабочий пример на "Васике" сервер, который обновременно "обрабатывает" нескольких клиентов и выводит всё на экран. |
|||
6
sezhik
23.05.10
✎
22:19
|
(5)Да IP не принципиально. У меня соединения нет ни локально ни по всякому.
"Васике" это VB имеется ввиду? |
|||
7
Torquader
23.05.10
✎
22:29
|
Да
|
|||
8
Torquader
23.05.10
✎
22:31
|
Кроме того, не забываем, что MSWinsock требует определённой строки установки "Васика" в реестре.
Ну и ждать надо, чтобы заработало, а не сразу "ловить" соединение. |
|||
9
sezhik
23.05.10
✎
22:35
|
(8) Ключ в реестр внесен иначе ругается на лицензию
Ожидание есть просто не выносил в пример ВинСокSrv.listen(); Подключитьобработчикожидания("Установкасоединения",5); If ВинСокSrv.State = 6 Then А на VB я много примеров пересмотрел. Даже в описании библиотеки есть. Но легче от этого не стало. :) |
|||
10
Torquader
23.05.10
✎
22:38
|
Сохранить как Server.hta и запустить (подключение в порт 12345), для разрыва соединения в телнете набрать команду EXIT.
<!-- данное приложение является сервером для приёма и передачи данных --> <HTML> <HEAD ID="ID1"> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;Charset=Windows-1251"> <TITLE>Сервер поддержки просмотра</TITLE> <DIV ID="SocketList"> </DIV> <SCRIPT LANGUAGE="VbScript"> Dim MaxSocketNumber ' количество подключенных сокетов 'Dim ShelLObject 'Set ShellObject=CreateObject("WScript.Shell") ' данная функция формирует код скрипта для обработки событий Function ProduceEventScript(ObjectName,Language,EventName,EventBody) ProduceEventScript="<" & "SCRIPT LANGUAGE=""" & Language & _ """ FOR=""" & ObjectName & """ EVENT=""" & EventName & """>" & vbCrLg & _ EventBody & vbCrLf & "<" & "/" & "SCRIPT>" & vbCrLf End Function ' данная процедура создаёт новый сокет или выбирает один из "умерших" ' "умершим" считается Socket, с которым было закрыто соединение Sub CreateAndListen() Dim i Dim o Dim r ' сначала перебираем все, которые готовы к работе For i=1 To MaxSocketNumber Step 1 Set o=Eval("Sock" & CStr(i)).Object If o.State=0 Then o.Protocol=0 o.LocalPort=12345 o.Listen() Set r=document.all.item("StatusList").rows(i) r.cells(1).innerHTML=CStr(o.State) r.cells(2).innerHTML="Слушаем" 'document.body.insertAdjacentHTML "BeforeEnd", _ 'CStr(i) & ")Найден закрытым и установлен на прослушивание<BR>" Exit Sub End If Next ' если все заняты, то мы должны создать новый и установить для него все обработчики MaxSocketNumber=MaxSocketNumber+1 i=CStr(MaxSocketNumber) o="Sock" & i ExecuteGlobal "Dim " & o & "Input" ExecuteGlobal "Dim " & o & "SCount" ExecuteGlobal "Dim " & o & "RCount" '{248DD896-BB45-11CF-9ABC-0080C7E7B78D} '{248DD896-BB45-11CF-9ABC-0080C7E7B78D} '{248DD896-BB45-11CF-9ABC-0080C7E7B78D} document.all.item("SocketList").insertAdjacentHTML "BeforeEnd", _ "<OBJECT ID=""" & o & _ """ CLASSID=""CLSID:248DD896-BB45-11CF-9ABC-0080C7E7B78D"" HEIGHT=""0"" WIDTH=""0""></OBJECT>" _ & vbCrLf & ProduceEventScript(o,"VbScript","ConnectionRequest(RequestId)", _ "NewConnection " & i & ",RequestId") & ProduceEventScript(o,"VbScript","Close", _ "CloseConnection " & i) & ProduceEventScript(o,"VbScript","Connect", _ "ConnectEvent " & i) & ProduceEventScript(o,"VbScript", _ "DataArrival(bytesTotal)","ReadData " & i & ",bytesTotal") & _ ProduceEventScript(o,"VbScript", _ "Error(Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay)", _ "ShowError " & i & _ ",Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay") & _ ProduceEventScript(o,"VbScript","SendComplete","EndSend " & i) & _ ProduceEventScript(o,"VbScript","SendProgress(bytesSent,bytesRemaining)", _ "SendProgress " & i & ",bytesSent,bytesRemaining") 'document.body.insertAdjacentHTML "BeforeEnd",i & _ '")Создан новый для прослушивания<BR>" Set o=Eval(o).Object o.Protocol=0 o.LocalPort=12345 o.Listen() Set r=document.all.item("StatusList").insertRow() r.insertCell().innerHTML=i r.insertCell().innerHTML=CStr(o.State) r.insertCell().innerHTML="Слушает" r.insertCell().innerHTML="Нет" r.insertCell().innerHTML="Нет" r.insertCell().innerHTML="0" r.insertCell().innerHTML="0" r.insertCell().innerHTML="Нет" r.insertCell().innerHTML="Нет" r.insertCell().innerHTML="Отключено" End Sub Sub ClosePort(SocketNumber) Dim o Dim r Dim l Set o=Eval("Sock" & CStr(SocketNumber)).Object Set r=document.all.item("StatusList").rows(SocketNumber) l=o.State r.cells(1).innerHTML=CStr(l) If l<>7 Then r.cells(9).innerHTML="Отключено" Else o.Close() r.cells(9).innerHTML="Отключили" End If End Sub ' данная процедура вызывается в момент подключения клиента к сокету Sub NewConnection(SocketNumber,RequestId) Dim o Dim i Dim r Dim ip Dim pt i=CStr(SocketNumber) o="Sock" & i ExecuteGlobal o & "Input=""""" ExecuteGlobal o & "SCount=0" ExecuteGlobal o & "RCount=0" Set o=Eval(o).Object ip=o.RemoteHostIP pt=o.RemotePort o.Close() o.Accept(RequestId) Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(o.State) r.cells(2).innerHTML="Подключен" r.cells(3).innerHTML=ip ' o.RemoteHost & ":" & RemoteIpAddress(o) r.cells(4).innerHTML=CStr(pt) ' o.RemotePort) r.cells(9).innerHTML="<BUTTON LANGUAGE=""VbScript"" ONCLICK=""ClosePort " & _ CStr(SocketNumber) & """>Отключить</BUTTON>" 'document.body.insertAdjacentHTML "BeforeEnd",i & _ '")Получен запрос от клиента " & o.RemoteHostIP & ":" & CStr(o.RemotePort) & "<BR>" CreateAndListen End Sub ' данная функция обрабатывает событие закрытия соединения от удалённого клиента Sub CloseConnection(SocketNumber) Dim r Sim o 'document.body.insertAdjacentHTML "BeforeEnd",CStr(SocketNumber) & _ '")Соединение закрылось с удалённой стороны<BR>" Set o=Eval("Sock" & CStr(SocketNumber)).Object Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(o.State) r.cells(2).innerHTML="Оборвалось" r.cells(9).innerHTML="Отключено" o.Close() End Sub Sub ProcessCommand(SocketNumber,CommandLine) Dim i Dim o Dim r 'Dim e Dim j Dim p i=CStr(SocketNumber) Set o=Eval("Sock" & i).Object 'Set e=ShellObject.Exec("CMD") 'e.StdIn.WriteLine(CommandLine & vbCrLf & "Exit") 'While e.Status<>1 'Wend 'o.SendData "Out:" & e.StdOut.ReadAll() & vbCrLf & "Err:" & e.StdErr.ReadAll() & vbCrLf Set r=document.all.item("StatusList").rows(SocketNumber) If CommandLine="LOGOUT" Then r.cells(2).innerHTML="Выход" r.cells(7).innerHTML="Нет" ElseIf CommandLine="EXIT" Then ClosePort SocketNumber ElseIf CommandLine="~" Then For j=1 to 1000 Step 1 o.SendData "Many data will be send" & vbCrLf Next r.cells(2).innerHTML="Проверка" Else j=InStr(1,CommandLine," ",vbBinaryCompare) If j=0 Then o.SendData "WrongCommand:" & CommandLine & vbCrLf r.cells(2).innerHTML="Команда" Else p=Left(CommandLine,j-1) If p="LOGIN" Then r.cells(2).innerHTML="Вход" r.cells(7).innerHTML=Mid(CommandLine,j+1) Else o.SendData "WrongCommandLine:" & CommandLine & vbCrLf r.cells(2).innerHTML="Команда" End If End If End If r.cells(8).innerHTML=CommandLine 'document.body.insertAdjacentHTML "BeforeEnd",i & ")Обработка команды:" _ '& CommandLine & "<BR>" End Sub ' данная функция принимает данные с удалённой стороны Sub ReadData(SocketNumber,bytesTotal) Dim i Dim o Dim s Dim l Dim r i=CStr(SocketNumber) o="Sock" & i Execute o & "Wait=0" Execute o & "RCount=" & o & "RCount+bytesTotal" l=Eval(o & "RCount") Set o=Eval(o).Object o.GetData s,8,bytesTotal 'document.body.insertAdjacentHTML "BeforeEnd",i & ")Получено " & _ '(bytesTotal) & " байт данных:" & s & "<BR>" Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(o.State) r.cells(2).innerHTML="Приём" r.cells(5).innerHTML=CStr(l) l=InStr(1,s,vbCrLf,vbBinaryCompare) If l=0 Then Execute "Sock" & i & "Input=" & "Sock" & i & "Input & s" Exit Sub End If Execute "ProcessCommand SocketNumber,Sock" & i & "Input & Left(s,l-1)" Do s=Mid(s,l+2) l=InStr(1,s,vbCrLf,vbBinaryCompare) If l=0 Then Exit Do ProcessCommand SocketNumber,Left(s,l-1) Loop Execute "Sock" & i & "Input=s" End Sub ' данная функция вызывается при ошибке обмена и в библиотеке Socket Sub ShowError(SocketNumber,Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay) Dim r 'document.body.insertAdjacentHTML "BeforeEnd",CStr(SocketNumber) & _ '")Ошибка. Код:" & CStr(Number) & " Описание:" & Description & _ '" КодБиблиотеки:" & CStr(Scode) & " Источник:" & Source & " ФайлПомощи:" & _ 'HelpFile & " ТочкаПомощи:" & HelpContext & " ОтменаВывода:" & _ 'CStr(CancelDisplay) & "<BR>" Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(Eval("Sock" & CStr(SocketNumber)).Object.State) r.cells(2).innerHTML="Ошибка" End Sub ' данная процедура вызывается при окончании передачи данных Sub EndSend(SocketNumber) Dim r Execute "Sock" & CStr(SocketNumber) & "Wait=0" 'document.body.insertAdjacentHTML "BeforeEnd",CStr(SocketNumber) & _ '")Передача данных завершена<BR>" Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(Eval("Sock" & CStr(SocketNumber)).Object.State) r.cells(2).innerHTML="Передано" End Sub ' данная процедура вызывается для анимации процесса передачи данных Sub SendProgress(SocketNumber,Sent,Waiting) Dim r Dim o o="Sock" & CStr(SocketNumber) Execute o & "SCount=" & o & "SCount+Sent" ' document.body.insertAdjacentHTML "BeforeEnd",CStr(SocketNumber) & _ '")Состояние передачи данных: Передано:" & CStr(Sent) & " Ожидает передачи:" _ '& CStr(Waiting) & "<BR>" Set r=document.all.item("StatusList").rows(SocketNumber) r.cells(1).innerHTML=CStr(Eval(o).Object.State) r.cells(2).innerHTML="Передача" r.cells(6).innerHTML=CStr(Eval(o & "SCount")) End Sub Sub ProcessInterval() Dim i Dim s Dim o For i=1 To MaxSocketNumber Step 1 s="Sock" & CStr(i) Set o=Eval(s).Object Set r=document.all.item("StatusList").rows(i) r.cells(1).innerHTML=CStr(o.State) If o.State=7 Then Execute s & "Wait=" & s & "Wait+1" l=Eval(s & "Wait") If l>10 Then o.SendData "Connection Test" & vbCrLf ElseIf l=10 Then document.all.item("StatusList").rows(i).cells(2).innerHTML="Пробуждение" ElseIf l=3 Then document.all.item("StatusList").rows(i).cells(2).innerHTML="Сон" End If End If Next End Sub ' данная функция вызывается при попытке установки соединения 'Sub CloseSocket(SocketNumber) ' document.body.innerHTML=document.body.innerHTML & CStr(SocketNumber) & ":Закрыто соединение" & CStr(SocketNumber) & "<BR>" 'End Sub 'Sub ReadData(SocketNumber,ByteNumber) ' Dim s ' Execute "Sock" & CStr(SocketNumber) & ".GetData s,8,ByteNumber" ' document.body.innerHTML=document.body.innerHTML & CStr(SocketNumber) & "Получены данные:" & CStr(ByteNumber) & ":" & s & "<BR>" 'End Sub 'Sub ShowError(SocketNumber,Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay) ' document.body.innerHTML=document.body.innerHTML & CStr(SocketNumber) & ":Ошибка. Код:" & CStr(Number) & " Описание:" & Description & " Scode:" & CStr(Scode) & " Искочник:" & Source & " ФайлСправки:" & HelpFile & " Справка:" & HelpContext & " Отмена:" & CStr(CancelDisplay) & "<BR>" 'End Sub 'Sub Sock0_ConnectionRequest(RequestId) 'Sub DoConnect(RequestId) ' Dim s ' Dim t ' MaxSocketNumber=MaxSocketNumber+1 ' MsgBox "RequestId=" & Cstr(RequestId) & vbCrLf & "MaxSocketNumber=" & CStr(MaxSocketNumber),0,"DEBUG" ' s="Sock" & CStr(MaxSocketNumber) ' document.all.item("SocketList").insertAdjacentHTML "BeforeEnd", _ '"<OBJECT ID=""" & s & """ CLASSID=""CLSID:248DD896-BB45-11CF-9ABC-0080C7E7B78D"" WIDTH=""0"" HEIGHT=""0""></OBJECT>" _ '& vbCrLf & "<" & "SCRIPT LANGUAGE=""VbScript"" FOR=""" & s & """ EVENT=""Error(Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay)"">" _ '& vbCrLf & "ShowError " & CStr(MaxSocketNumber) & ",Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay" _ '& vbCrLf & "<" & "/" & "SCRIPT>" & vbCrLf & _ '"<" & "SCRIPT LANGUAGE=""VbScript"" FOR=""" & s & """ EVENT=""Close"">" _ '& vbCrLf & "CloseSockect " & CStr(MaxSocketNumber) & vbCrLf & _ '"<" & "/" & "SCRIPT>" & vbCrLf & _ '"<" & "SCRIPT LANGUAGE=""VbScript"" FOR=""" & s & """ EVENT=""DataArrival(bytesTotal)"">" _ '& vbCrLf & "ReadData " & CStr(MaxSocketNumber) & ",bytesTotal" & vbCrLf & _ '"<" & "/" & "SCRIPT>" & vbCrLf ' ' 't="Sub " & s & "_Error(Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay)" & vbCrLf & "ShowError " & CStr(MaxSocketNumber) & ",Number,Description,Scode,Source,HelpFile,HelpContext,CancelDisplay" & vbCrLf & "End Sub" ' 'MsgBox t,0,"DEBUG" ' 'ExecuteGlobal t ' 't="Sub " & s & "_Close()" & vbCrLf & "CloseSocket " & CStr(MaxSocketNumber) & vbCrLf & "End Sub" & vbCrLf ' 'MsgBox t,0,"DEBUG" ' 'ExecuteGlobal t ' 't="Sub " & s & "_DataArrival(bytesTotal)" & vbCrLf & "ReadData " & CStr(MaxSocketNumber) & ",bytesTotal" & vbCrLf & "End Sub" & vbCrLf ' 'MsgBox t,0,"DEBUG" ' 'ExecuteGlobal t ' 'MsgBox "0=" & Eval("TypeName(" & s & ".Object)") &vbCrLf & "1=" & TypeName(Sock0.Object),0,"DEBUG" ' Set o=Eval("Sock" & CStr(MaxSocketNumber-1)).Object ' o.Close() ' o.Accept(RequestId) ' Set o=Eval("Sock" & CStr(MaxSocketNumber)).Object ' o.Protocol=0 ' o.LocalPort=12345 ' o.Listen() ' 'Sock1.Listen() ' 't=s & ".Object.Accept(RequestId)" ' 'MsgBox t,0,"DEBUG" ' 'Execute t ' 'document.body.innerHTML=document.body.innerHTML & CStr(MaxSocketNumber) & ":Подключение<BR>" 'End Sub Sub Inita() ' document.all.item("SocketList").insertAdjacentHTML "BeforeEnd", _ '"<OBJECT NAME=""Sock0"" CLASSID=""CLSID:248DD896-BB45-11CF-9ABC-0080C7E7B78D"" WIDTH=""0"" HEIGHT=""0"" ConnectionRequest=""Sock0_ConnectionRequest""></OBJECT>" _ '& vbCrLf & "<" & "SCRIPT LANGUAGE=""VbScript"" FOR=""Sock0"" EVENT=""ConnectionRequest(RequestId)"">" & vbCrLf & _ '"DoConnect RequestId" & vbCrLf & "<" & "/" & "SCRIPT>" & vbCrLf ' 'Dim l 'Set l=document.all.item("SocketList") 'l.insertAdjacentHTML "BeforeEnd","<OBJECT ID=""Sock0"" WIDTH=""0"" HEIGHT=""0""></OBJECT>" MaxSocketNumber=0 'window.alert(ProduceEventScript("ЭтоОбъект","Язык","Собыитие(Параметры)","ТелоОбработчика Параметры")) CreateAndListen window.setInterval "ProcessInterval()",1000,"VbScript" ' Sock0.Object.Protocol=0 ' Sock0.Object.LocalPort=12345 ' Sock0.Object.Listen() ' 'ExecuteGlobal "Sub Sock0_ConnectionRequest(RequestId)" & vbCrLf & "DoConnect RequestId" & vbCrLf & "End Sub" End Sub 'Dim ListenObject 'Dim Doc 'Set ListenObject=CreateObject("MSWinsock.Winsock") 'ListenObject.Protocol=0 'ListenObject.LocalPort=1234 'ListenObject.Listen() 'Set Doc=document Set window.onload=GetRef("Inita") </SCRIPT> <SCRIPT LANGUAGE="VbScript" FOR="ListenObject" EVENT="ConnectionRequest"> 'window.alert("1234") 'Sub ConnectionRequest(RequestId) ' window.alert("Входящее соединение:" & CStr(RequestId)) 'End Sub </SCRIPT> <SCRIPT LANGUAGE="VbScript" FOR="document" EVENT="onclick"> 'window.alert("Load") 'Sub Doc_onclick() 'End Sub 'window.alert(document.applets.length) Dim i Dim s s="Список состояний:" For i=1 To document.applets.length Step 1 s=s & vbCrLf & "Состояние" & CStr(i) & ":" & CStr(Eval("Sock" & CStr(i)).Object.State) Next window.alert(s) ' & vbCrLf & CStr(document.all.item("StatusList").rows(0).cells(0).innerHTML)) </SCRIPT> <SCRIPT LANGUAGE="JavaScript"> function RemoteIpAddress(SockObject) { return SockObject.RemoteHostIP; } </SCRIPT> </HEAD> <BODY> <TABLE ID="StatusList" WIDTH="100%" BORDER="1" CELLPADDING="0" CELLSPACING="0"> <TR> <TD>№</TD> <TD>Состояние</TD> <TD>Операция</TD> <TD>Клиент</TD> <TD>Порт</TD> <TD>Принято</TD> <TD>Передано</TD> <TD>Пользователь</TD> <TD>Команда</TD> <TD>Отключить</TD> </TR> </TABLE> </BODY> </HTML> |
|||
11
Torquader
23.05.10
✎
22:43
|
Собственно, здесь применяется событие NewConnection, которое в 1С не поймаешь.
Придётся переделывать на обработку ожидания. |
|||
12
sezhik
23.05.10
✎
22:45
|
(10) o.Accept(RequestId)
Откуда мы берем этот RequestId? |
|||
13
Torquader
23.05.10
✎
23:01
|
Я сейчас внимательно посмотрел описание библиотеки MSWinSock.
Этот RequestId нам передаётся в событии ConnectionRequest) и получить его другим способом нет возможности. |
|||
14
sezhik
23.05.10
✎
23:01
|
Или может с другими компонентами кто работал по TCP?
|
|||
15
sezhik
23.05.10
✎
23:12
|
(13) И как его в 1С получить?
|
|||
16
Torquader
23.05.10
✎
23:14
|
Самое главное, что MSWinsock вообще не меняет своего состояния при получении подключения (вызывается событие, и если оно не делает подключение, то ничего вообще не происходит).
|
|||
17
kot_bcc
23.05.10
✎
23:16
|
(3)
1. Если забинден 127... - то и коннектиться нужно по 127... Но лучше, все-же - адрес не указывать. Тогда и по доменному имени будет коннект. 2. Возможно лучше так (после listen()): Пока КтоНибудьНеПрервёт() и ВинСокSrv.State <> 9 Цикл Если ВинСокSrv.State <> 2 Тогда Сообщить(ВинСокSrv.State); КонецЕсли; КонецЦикла |
|||
18
sezhik
23.05.10
✎
23:18
|
(17) Самое хреновое что телнет и иже с ними не могут законектится на этот порт хотя судя по статусу он его создал.
|
|||
19
Torquader
23.05.10
✎
23:24
|
Var SocketObject;//переменная для хранения сокета
Var SockState; Procedure InitSockObject() SocketObject=CreateObject("MSWinsock.Winsock.1"); SocketObject.Protocol=0;// TCP/IP SocketObject.LocalPort=1234;// устанавливаем порт, в который мы ловим соедиенение SocketObject.Listen();// запускаем прослушивание EndProcedure Procedure WaitConnect() //Status("Проверка состояния"); If SocketObject.State<>SockState Then SockState=SocketObject.State; Message("Состояние:"+String(SockState)); EndIf; If SocketObject.State=6 Then// если подключились DoMessageBox("Подключение"); Message("Пытаемся подключиться"); SocketObject.Accept(SocketObject.SocketHandle);// принимаем SocketObject.SendData("Connection test"); SocketObject.Close(); InitSockObject(); EndIf; //Status("Host="+SocketObject.RemoteHost); try SocketObject.Accept(SocketObject.SocketHandle); except Status("Мимо:"+CurrentTime()); return; endtry; Message("Успешно"); SocketObject.SendData("Connection test"); SocketObject.Close(); InitSockObject(); EndProcedure NetStat -a показывает, что соединение есть, и при подключении с TelNet можно видеть, что система ожидает подключения, но SocketObject.State остаётся равным 2 и не меняется, а событий ConnectionRequest проходит мимо 1С. |
|||
20
kot_bcc
23.05.10
✎
23:29
|
(18) Это нормально. Сокеты, как технология (и как её реализация в Windows) устроены так, что, пока на сервере акцепта нет - клиент ничего не узнает (не перейдёт в состояние connected).
|
|||
21
sezhik
23.05.10
✎
23:30
|
(19) а SocketObject.SendData("Connection test"); работает?
|
|||
22
Torquader
23.05.10
✎
23:36
|
(21) Нет.
Дело в том, что Socket по приходу соединения всё равно находится в состоянии Listen как бы мы его не пинали. А событие в 1C отловить - это внешнюю компоненту писать надо. Сейчас, когда приходит соединение, Socket генерит событие, но мы его поймать не можем (так как нечем) и получить из него requestID тоже не можем. Кроме того, при написании даже в Visual Basic я столкнулся с тем, что requestID не передаётся другому сокету (ну теряется соединение и всё тут). Но клиента на 1С написать можно (там не надо события использовать), а вот сервер - видимо не судьба. |
|||
23
Torquader
23.05.10
✎
23:37
|
Ладно - на досуге посмотрю.
|
|||
24
sezhik
23.05.10
✎
23:40
|
(22) Абидно да!
|
|||
25
sezhik
23.05.10
✎
23:44
|
А может кто то работал с другими ВК? где все проще! или пусть сложнее но работает. :)
|
|||
26
sezhik
24.05.10
✎
00:15
|
Я нашел одну нормальную ВК GnsListen.dll она нормально работает, но почемуто в метод send можно вставить данные в ковычках. а переменную вставить нельзя. А у меня в посылке есть непачтные символы. и как их туда вписать ума не приложу. Приведу код может кто подскажет.
Listen = Новый COMОбъект("GnsListen.Listen"); if Listen <> 0 then Message("Объект Listen создан"); if (Listen.Run("4997") <> 1) then Message("Не смогли запуститься"); else Message("Запуск успешен"); endif; else Message("Проблема при создании объекта Listen"); endif; Перем Work; Перем Query; //ЭтаФорма.ПодключитьОбработчикОжидания("Check",10); Query = Listen.GetQuery(); if (Query = "<none/>") then Попытка Listen.SendRecive("<ok/>"); //Message(ok); Исключение Message("ok"); КонецПопытки; else Сообщить(Query); endif; Вот если в Listen.SendRecive("<ok/>"); вместо <ok/> вставляеш переменную, то отсылает 0 байт. может кто знает как вылечить? |
|||
27
kot_bcc
24.05.10
✎
01:07
|
(26) Может, 1С пытается послать переменную не как строку? Если привести явно попробовать (Строка(переменная))?
|
|||
28
sezhik
24.05.10
✎
01:22
|
(26) не хочет. все равно пишет 0 байт послано.
|
|||
29
kot_bcc
24.05.10
✎
01:42
|
(28) Вообще, эту фигню, конечно, можно победить через "Выполнить", но это уже мазохизм:) Посмотрите сюда 1С + работа с сокетами, там в конце вроде чего нарешали, может, поможет...
|
|||
30
sezhik
24.05.10
✎
01:50
|
(29) не поиском я умею пользоватся, но там как такового решения нет. Все догадки
|
|||
31
sezhik
24.05.10
✎
02:03
|
(29) (23) за помошь спасибо!
|
|||
32
sezhik
25.05.10
✎
12:20
|
up может все же у кого получилось винсок запустить?
|
|||
33
sezhik
25.05.10
✎
18:57
|
Не бросайте о боги 1С! :)
|
|||
34
НЕ_
О_ПРЕДЕЛЕ_НО 04.06.10
✎
09:14
|
Кидайте элемент управления MSWinsock на форму и будет вам счастье
|
|||
35
НЕ_
О_ПРЕДЕЛЕ_НО 04.06.10
✎
10:52
|
Вот работающий пример
[URL]http://www.rapidshare.ru/1511141[/URL] |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |