Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Массив элементов WinSock Добавлено: 22.11.09 17:11  

Автор вопроса:  Millenium | Web-сайт: www.aliyev.us | ICQ: 629966 
Вопрос собственно в в том что я динамически добавляю элементы Winsock. КОгда закрывается соединение, я выгружаю винсоки. Но у меня массив растёт. как более быстро и аккуратно перебрать массив и проверить на наличие пустых элементов в массиве и загружать новые винсоки в эти пустые области? Главная проблема, как проверить, занятли элемент массива или-же пустует-ли тот или иной индекс? Касательно элемента WInsock...

Ответить

  Ответы Всего ответов: 8  

Номер ответа: 1
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #1
Добавлено: 23.11.09 22:17
как проверить загружен ли элемент винсока с указанным индексом?

Ответить

Номер ответа: 2
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #2 Добавлено: 24.11.09 00:03
А не проще вести параллельно массив флагов?
Загрузил новый сокет, редим пресервом увеличил массив, выставил последний флаг в True (занято).
Закрыл сокет, выгрузил его, опустил соответствующий флаг (False, свободно).
Ищешь первый свободный индекс по массиву флагов, нашел свободный, грузишь сокет, поднимаешь флаг занятости.

Ответить

Номер ответа: 3
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #3
Добавлено: 24.11.09 10:07
Вышли свой пример или подправь мой:
  1. Public Sub sckConnect()
  2.     If lvConn.ListItems.Count > 0 Then lvConn.ListItems.Remove 1
  3.     'Start to listen
  4.     tbServer.Buttons(1).Enabled = False
  5.     tbServer.Buttons(2).Enabled = True
  6.     wsSrv(0).Close
  7.     wsSrv(0).LocalPort = sckPortTL
  8.     wsSrv(0).Listen
  9.     wsLoaded(0) = True
  10. End Sub

При закрытие:
  1. Private Sub wsSrv_Close(Index As Integer)
  2.     WriteLog LoadResString(123) & Space(1) & wsSrv(Index).RemoteHostIP
  3.     If lvConn.ListItems.Count > 0 Then lvConn.ListItems.Remove Index
  4.     If Index > 0 Then
  5.         Unload wsSrv(Index)
  6.         wsLoaded(Index) = False
  7.     End If
  8.     sckCurConn = sckCurConn - 1
  9.     If sckCurConn < 0 Then sckCurConn = 0
  10. End Sub

При подключение:
  1. Private Sub wsSrv_Connect(Index As Integer)
  2.     WriteLog "Connected with " & requestID & " (IP: " & wsSrv(sckCurConn).RemoteHostIP & ")"
  3. End Sub

При запросе на подключение:
  1. Private Sub wsSrv_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  2.     '&#207;&#240;&#232; &#239;&#238;&#239;&#251;&#242;&#234;&#229; &#234;&#235;&#232;&#229;&#237;&#242;&#224; &#239;&#240;&#232;&#241;&#238;&#229;&#228;&#232;&#237;&#232;&#242;&#241;&#255; &#234; &#241;&#229;&#240;&#226;&#229;&#240;&#243;
  3.     sckCurConn = sckCurConn + 1 ' &#239;&#240;&#232;&#225;&#224;&#226;&#232;&#242;&#252; 1 &#232;&#237;&#228;&#229;&#234;&#241;
  4.     WriteLog LoadResString(121) & Space(1) & requestID
  5.     If sckCurConn > sckMaxConn Then
  6.         WriteLog LoadResString(155)
  7.         sckCurConn = sckCurConn - 1
  8.     Else
  9.     
  10.     Load wsSrv(sckCurConn)
  11.     wsLoaded(sckCurConn) = True
  12.     wsSrv(sckCurConn).Accept requestID
  13.     WriteLog LoadResString(122) & Space(1) & requestID & " (IP: " & wsSrv(Index).RemoteHostIP & ")"
  14.     
  15.     lvConn.ListItems.Add sckCurConn, , wsSrv(sckCurConn).RemoteHostIP, , 2  '&#228;&#238;&#225;&#224;&#226;&#235;&#229;&#237;&#232;&#229; &#239;&#229;&#240;&#229;&#236;&#229;&#237;&#237;&#238;&#233; &#226; &#241;&#239;&#232;&#241;&#238;&#234;
  16.     'lvConn.ListItems(sckCurConn).SubItems(1) = Now
  17.     lvConn.ListItems(sckCurConn).EnsureVisible
  18.     
  19.     With lvConn.ListItems(sckCurConn)
  20.         .SubItems(1) = wsSrv(sckCurConn).RemoteHostIP
  21.         .SubItems(2) = Now
  22.         .SubItems(3) = "--:--:--"
  23.         '.SubItems(4) = wsSrv(sckCurConn).Tag
  24.         '.SmallIcon = 3
  25.     End With
  26.     End If
  27.     
  28.     'txtStatus.Text = txtStatus.Text & "Connected to: " & sockMain(sckCurConn).RemoteHostIP & vbCrLf
  29. End Sub

Ответить

Номер ответа: 4
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #4 Добавлено: 24.11.09 16:37
Вот набросал, проверил, работает
  1. Option Explicit
  2.  
  3. Private bSocket1() As Boolean
  4.  
  5. Private Sub Form_Load()
  6.     ReDim bSocket1(1)
  7.     bSocket1(0) = True
  8.     Winsock1(0).LocalPort = 911
  9.     Winsock1(0).Listen
  10. End Sub
  11.  
  12. Private Sub Winsock1_Close(Index As Integer)
  13.     Winsock1(Index).Close
  14.     bSocket1(Index) = False
  15. End Sub
  16.  
  17. Private Function GetFreeIndex() As Integer
  18.     For GetFreeIndex = 1 To UBound(bSocket1)
  19.         If bSocket1(GetFreeIndex) = False Then Exit For
  20.     Next
  21.     If GetFreeIndex = Winsock1.Count Then
  22.         Load Winsock1(GetFreeIndex)
  23.         ReDim Preserve bSocket1(GetFreeIndex)
  24.         bSocket1(GetFreeIndex) = True
  25.     End If
  26. End Function
  27.  
  28. Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  29.     Dim FreeIndex As Integer
  30.  
  31.     FreeIndex = GetFreeIndex
  32.     Winsock1(0).Close
  33.     Winsock1(FreeIndex).Accept requestID
  34.     Winsock1(0).Listen
  35.     Caption = "Соединен сокет " & FreeIndex & " из " & UBound(bSocket1)
  36. End Sub

Ответить

Номер ответа: 5
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #5 Добавлено: 24.11.09 16:38
никакой нафиг выгрузки сокетов, загрузка нового только если нет свободных

Ответить

Номер ответа: 6
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #6 Добавлено: 24.11.09 17:27
Ааа, вот упустил одну вещь, так будет правильнее
  1. Private Function GetFreeIndex() As Integer
  2.     For GetFreeIndex = 1 To UBound(bSocket1)
  3.         If bSocket1(GetFreeIndex) = False Then Exit For
  4.     Next
  5.     If GetFreeIndex = Winsock1.Count Then
  6.         Load Winsock1(GetFreeIndex)
  7.         ReDim Preserve bSocket1(GetFreeIndex)
  8.     End If
  9. End Function
  10.  
  11. Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  12.     Dim FreeIndex As Integer
  13.  
  14.     FreeIndex = GetFreeIndex
  15.     Winsock1(0).Close
  16.     bSocket1(FreeIndex) = True
  17.     Winsock1(FreeIndex).Accept requestID
  18.     Winsock1(0).Listen
  19.     Caption = "Соединен сокет " & FreeIndex & " из " & UBound(bSocket1)
  20. End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Smith



ICQ: adamis@list.ru 

Вопросов: 153
Ответов: 3632
 Профиль | | #7 Добавлено: 24.11.09 17:35
Я тебя в асю добавил

Ответить

Номер ответа: 8
Автор ответа:
 Millenium



ICQ: 629966 

Вопросов: 118
Ответов: 903
 Web-сайт: www.aliyev.us
 Профиль | | #8
Добавлено: 03.12.09 08:44
Добавились :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам