Имя: Пароль:
1C
 
У кого есть реально рабочий пример работы с 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]