powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Winsock
18 сообщений из 18, страница 1 из 1
Winsock
    #37534683
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могу приручить сокет
Вначале пробова на одной форме работать с сокетом. Первый запрос работает нормально, все следующии или как повезет могут выдать сообщение wrong protocol or connection state for the requested transaction or request (№40006)
Winsock1.State = 9 а иногда Winsock1.State=6
Видимо не правильно закрываю открытый порт. Но на том же порте когда делаю send data если не закрываю, то до поры работает, потом ошибка 40006. Иногда даже бывает, что сразу при старте такая ошибка выбивает. Наводит меня на мысль что открытый к примеру сокет
Winsock1.Protocol = sckTCPProtocol
Winsock1.LocalPort = 20020
Winsock1.RemoteHost = "188.93.22.242"
Winsock1.RemotePort = 80
нуждается в закрытии и нужно открыть следующий свободный, например 20021. Так в чем прикол ? Winsock1.Close должен закрывать соединение но однако ошибка после Close если сделать Connect и дать Send будет 100%-тной а State = либо 9 либо 6. Как грамонтно освобождать порты ?
Я уже в отдельную форму переместил для эксперемента и вызываю ее как модальную, чтоб не было дополнительных процессов в связи с DoEvents также разставил логичиские переменные что не дадут доступ к коду программы пока не будет закрыто окно в котором сокет и поле для запроса и поле для ответа. Первый раз ПОЧТИ всегда ответ приходит успешно, но потом просто убийство

с уважением Андрей
...
Рейтинг: 0 / 0
Winsock
    #37535716
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Долго искал, но нашел. В даном архиве есть модуль и клас который подключаем к форме например с помощью

Код: 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.
Option Explicit
Dim WithEvents Client As CSocketMaster

Private Sub Command1_Click()
  Client.Connect "ххх.1хх.хх.ххх", "80"
End Sub

Private Sub Form_Load()
  Set Client = New CSocketMaster
End Sub

Private Sub cmdSend_Click()
  Client.SendData txtMessage
  txtMessage = ""
End Sub


Private Sub Client_Connect()
  cmdSend.Enabled = True
End Sub

Private Sub Client_CloseSck()
  cmdSend.Enabled = False
  cmdConnect.Enabled = True
  'txtPort.Enabled = True
  MsgBox "Connection closed"
Client.CloseSck
End Sub

Private Sub Client_DataArrival(ByVal bytesTotal As Long)
  Dim data As String
  Client.GetData data
  txtLog = txtLog + data + vbCrLf
End Sub

Private Sub Client_Error(ByVal Number As Integer, Description As String, ByVal sCode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
  MsgBox Description, vbCritical, "Client Error " & Number
  cmdSend.Enabled = False
  cmdConnect.Enabled = True
  txtPort.Enabled = True
  Client.CloseSck
End Sub

"+" этой программы - все прозрачно. Видно как работает WinSock.
"+" Соединения уже не выдают ошибок при повторном соединении после закрытия
"+" довольно просто используется
"+" с помощью сокета можна методом POST отправлять по шаблону протокола также файлы

качаем CSocketMas.rar, подключаем к своему проэкту и радуемся
...
Рейтинг: 0 / 0
Winsock
    #37535795
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Winsock
    #37535839
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот как с этим бороться ?

Ответ от сервера:
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
X-Powered-By: ASP.NET
Date: Sun, 20 Nov 2011 17:27:16 GMT
Content-Length: 30654

событие Client_DataArrival(ByVal bytesTotal As Long)
принимает по разному, но примерно от 1000 до 3000 байт.
Код: plaintext
1.
2.
3.
4.
  Dim data As String
che:
  Client.GetData data, vbString,  1000 
  txtLog = txtLog + data '+ vbCrLf
If data <> "" Then GoTo che
этот код также ничего не помогает поскольку в буфере больше чем bytesTotal байт не приходит, а повторно собитие Client_DataArrival не возникает. Что делать ?


Перешол бы на
Код: plaintext
1.
2.
3.
    Set oHttp = CreateObject("MSXML2.XMLHTTP")
    If Err.Number <>  0  Then
        Set oHttp = CreateObject("MSXML.XMLHTTPRequest")
    End If
он безотказно работает, но каждый запрос сохраняет на локалке (нафиг нужно), хотя с этим можно смериться а вот как передать тогда ним файл методом POST или вопше любие бинарные данные ???
...
Рейтинг: 0 / 0
Winsock
    #37536052
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то Valeriu:
работает безотказно.
Если в запросе указано "Connection: Keep-Alive", тогда нужно самому проверять по "Content-Length:" и обрезать.
Если указано "Connection:Close" тогда после события закрытия конекта можно также брать готовое значения.
...
Рейтинг: 0 / 0
Winsock
    #37536248
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так-же работал с этим пока не столкнулся с вышеуказанным казусом.
Пришлось использовать http://www.ostrosoft.com/oswinsck.asp
И сразу все пошло. Но одно смущает, это "немного" платное
...
Рейтинг: 0 / 0
Winsock
    #37536355
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
событие Client_DataArrival(ByVal bytesTotal As Long)
принимает по разному, но примерно от 1000 до 3000 байт.

/topic/840216&hl=
...
Рейтинг: 0 / 0
Winsock
    #37536371
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам нужно словить событие начало приема данных и событие окончание приема данных
Т.е. должны соблюдаться эти условия для приема данных в полном обьеме

Я например контролирую окончание передачи со стороны сервера примерно так

Код: 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.
Option Explicit
'=============================
'EVENTS
'==============================
Public Event DataArrival(ByVal bytesTotal As Long)
Private m_blnHeaderArrived As Boolean
Private m_var( 0  To  13 ) As String
Private m_strHeader As String
Private WithEvents GTMCmd As OSWINSCK.Winsock
------------------

Private Sub GTMCmd_onDataArrival(ByVal bytesTotal As Long)
Dim m_strChunk As String, Ero As String
Dim cnt As Integer, rec As Integer
Dim varFull() As String

On Error GoTo Error_Handler
m_blnHeaderArrived = False
Call Reset
GTMCmd.GetData m_strChunk
    'if header hasn't arrived pentru functii ... tot aici
    m_strHeader = m_strHeader & m_strChunk

    '---------------------------------------------------------------
    'if header hasn't arrived. QUIT - "F"  No QUIT - "R"
    '---------------------------------------------------------------
    If InStr(m_strHeader, Chr( 255 ) & Chr( 255 ) & Chr( 255 ) & Chr( 255 )) Then
    ...................
...
Рейтинг: 0 / 0
Winsock
    #37537216
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пользуюсь "OSWINSCK.dll". А что с проплатой ? Работает. Потом заблокируется ?
...
Рейтинг: 0 / 0
Winsock
    #37537250
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оканцовку буду отлавливать исходя из теории.
Ответ должен начинаться из:
"HTTP/1.1 200 OK"
Для этого нужно в одну переменную загнать строчку Status1=Left(InResponse, InStr(InResponse,vbcrlf)-2 при условии что InStr(InResponse,vbcrlf)>10
Из этого можно опознать начало также по статусу "200 OK" или опознавать другие статусы если нужно Status1=Right(Status1,6) грубо отрезали проверили - есть начало
Дальше ищем, ждем "Content-Length:" который также не сложно вычеслить. В случае если за определенное времья не дожыдаемся - закрываем соединение и делаем еще попытку. Если извесно Length - смело ждем дозагрузки пакета до Length длины. Если будет больше данных, то часть Kod=Left(InResponse, Length) получаем, остальное InResponse=Mid(InResponse, Length+1)
Вот где то по таком сценарию буду писать код
...
Рейтинг: 0 / 0
Winsock
    #37537295
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПользуюсь "OSWINSCK.dll". А что с проплатой ? Работает. Потом заблокируется ?
Нет. Для личного пользования free
...
Рейтинг: 0 / 0
Winsock
    #37537377
Valeriu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если конкретнее :

Non-commercial license (free)
Unlimited usage for developing non-commercial applications.


Неограниченное использование для разработки некоммерческих приложений.

Я так понимаю для опенсорс можно использовать бесплатно
...
Рейтинг: 0 / 0
Winsock
    #37537412
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот из Вашего посылания на библиотеку я скачал и там был проэкт VB. Я так грубо по своему налепил и у меня пока работает, не вредничает. Хоть там нужно много чего проверять чтоб не было ошибок. Хочу сделать работающий масив для более быстрой работы
Код: 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.
Private Sub txtRecv_Change()
  Dim t As String
  Dim i As Long
  Dim i2 As Long
  Dim st1 As String
  Dim st2 As String
  t = txtRecv.Text

If Label10.Visible = False Then
  i = InStr(t, vbCrLf)
  If i >  10  Then
    st1 = Left(t, i -  2 )
    If UCase(Left(st1,  4 )) = "HTTP" Then
      Label10.Visible = True
       i2 = InStr(t, " ") +  1 
       If i2 >  0  Then
         Label9.Caption = Mid(t, i2, i - i2)
       End If
    End If
  End If
End If

If Label10.Visible = True Then
    i = InStr(LCase(t), "content-length:")
    i2 = InStr(t, vbCrLf & vbCrLf)
    If i >  0  And i < i2 Then
      i2 = InStr(i, t, vbCrLf)
      If i2 >  0  Then
        st2 = Mid(t, i +  16 , i2 - i)
        Label7.Visible = True
        Label8.Caption = st2
      End If
    End If
End If

If Label7.Visible = True Then
  If Len(txtRecv) >= Val(Label8.Caption) Then
    i2 = InStr(t, vbCrLf & vbCrLf)
    If i2 >  0  Then
      Text2.Text = Mid(t, i2 +  4 , Val(Label8.Caption))
      If cmdConnect.Caption <> "Connect" Then
        Call cmdConnect_Click
      End If
    End If
  End If
End If

  'Debug.Print o.SocketHandle
  Debug.Print o.State
End Sub

Label10 - с текстом "пришел статус" , Label9 - сам статус (200 ОК или другой)
Label7 - извесна длина, Label8 - длина

также остается доделать "количество запросов" и "ожидание", чтоб в случае торможения преждевременно закрывал конект и делал запрос еще раз

Код нужно упрощать, поскольку может быть заметно торможение. Потом все Label перекину в обычные переменные как статус

Код также нужно конвертовать после получения в кирилицу.
отправка данных MSXML2.XMLHTTP ("POST@) и прием результатов
у меня не получается
выдает ошибку сдесь .Write МояПеременнаяТипаString
На запас у меня уже есть своя функция сделана давно через IF ELSEIF и CASE
...
Рейтинг: 0 / 0
Winsock
    #37537574
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если контрол виснет, делаю так
Код: plaintext
1.
2.
  Set o = Nothing
  Set o = New OSWINSCK.Winsock
  cmdConnect.Caption = "Connect"

Вопрос: Как создать масив ?

Dim WithEvents o As OSWINSCK.Winsock
и
Set o = New OSWINSCK.Winsock
в масив не береться

Set o(1) = New OSWINSCK.Winsock - ошибка
Dim WithEvents o(1) As OSWINSCK.Winsock - ошибка
Public o(100) as OSWINSCK.Winsock - работает но без Set ничего не дает
...
Рейтинг: 0 / 0
Winsock
    #37570172
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не заикнулся о Load
В одном из примеров увидел такой способ и офигел как все просто. set ... =new ... прятается
Я раньше думал что load можно применять только для Form, а оказывается ним можно клепать масивы нужных элементов
...
Рейтинг: 0 / 0
Winsock
    #37570174
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к примеру создаете любой элемент, в индекс свойствах ставите значение ноль.
Дальше в процедуре пишем Load название_элемента(новый индекс)
будет создано под новым индексом новый элемент который унаследует все свойства от нулевого или предыдущего (не проверял). Для проверки достаточно изменить хотябы (если видим элемент) Left или Top. События работают по стандартной схеме только с масивом (по Index разбираем). Таким способом удалось ускорить процес конектов WinSock а элементы которые сделали свою работу либо была какая-то ошибка удалялись. Проблему решено))
...
Рейтинг: 0 / 0
Winsock
    #37570242
Ципихович Эндрю
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей159, весь топик читал, многое не понятно ...
читал начало >закрываю открытый порт
читал конец >Проблему решено))
Конец очень впечатляет...
Не могли бы Вы выложить конечный код и пояснить практическую его значимость для Вас, возможно что-то смогу почерпнуть для себя, спасибо
...
Рейтинг: 0 / 0
Winsock
    #37570437
Фотография Андрей159
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Этот код не должен попадать в руки всем.
Буду постить свой бесплатный сайт на ucoz создавая быстрым способом статьи накопленные заранее в базу (без повторений).
Хочу всю работу скинуть на машину, пусть работает
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Winsock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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