Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Проблема с моей прогой Добавлено: 15.02.06 17:01  

Автор вопроса:  AsHeS | ICQ: 229759992 
Только что закончил писать свою прогу и столкнулся с довольно-таки не приятным глюком :
Сама прога являеться http серваком в который встроенна электронная библиотека. Для исполнения http использовал винсок компонент ВБ. Информация храниться в базе данных Access и использую я её с помощью объекта дата. В основном код - обработка строк итд. Я конечно понимаю что такого описания мало , но код большой и разбираться в нем врядли кто-нибудь станет :(
Суть бага в том что после нескольких запросов Internet Explorer пишет что сервер более не доступен. Но при этом прога вроде как работает. Может кто знает что это может быть ???

Ответить

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

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



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #1
Добавлено: 15.02.06 17:07
А ты множишь сокеты или работаешь против одного?
Если один сокет, то может он занят в это время?

Я когда то написал похожий сервер.
До сих пор работает, способен обработать до 100 (можно и более) параллельных запросов

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #2 Добавлено: 15.02.06 17:16
У меня 1 сокет , т.е он получает инфу , серв обрабатывает , отсылает и снова слушает. Не должен он быть занят - я пробую с 1 компа и ИЕ показывает что предыдущюю страницу он скачал. А когда рефреш нажимаешь раз 10 - серв уходит в даун. Не знаю что мне делать ;( Мне щас прога эта ПОЗАРЕЗ нужна

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #3 Добавлено: 15.02.06 17:21
Помню какой-то пример был wscServer.Accept
requestID работа перебрасывалась на 2 сокет, а основной снова слушает - но нигде не могу найти . Да и неуверен что поможет. Прогу надо завтра отдавать , а тут такой баг открылся :(((

Ответить

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



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #4
Добавлено: 15.02.06 17:46
Скорее всего в этом проблема.
Код у меня примерно такой:
Dim bSending() As Boolean
Dim bFreeAccept() As Boolean

Private Sub Listen_ConnectionRequest(ByVal requestID As Long)
Debug.Print Now, "Listen_ConnectionRequest", requestID
Dim i As Long
    'find free accept winsock
    For i = 0 To NumSockets
        If bFreeAccept(i) Then Exit For
        DoEvents
    Next
    Debug.Print Now, "Listen_ConnectionRequest->Find free ", i
    ConcurrentlyConnections = ConcurrentlyConnections + 1
    If ConcurrentlyConnections > MaxConnections Then MaxConnections = ConcurrentlyConnections
    bFreeAccept(i) = False
    If Accept(i).State <> sckClosed Then Accept(i).Close
    Accept(i).Accept requestID
End Sub


Private Sub Accept_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Debug.Print Now, "Accept_DataArrival ", Index, bytesTotal

Dim strData As String
    Accept(Index).GetData strData
    Text1.Text = strData
    DoEvents
    bSending(Index) = True
    Accept(Index).SendData "OK " & Listen.RemotePort
    Do Until Not bSending(Index)
         DoEvents
    Loop
    Accept(Index).Close
    bFreeAccept(Index) = True
    DoEvents
Debug.Print Now, "Accept_DataArrival->Free", Index, ConcurrentlyConnections
    ConcurrentlyConnections = ConcurrentlyConnections - 1
End Sub

Private Sub Accept_SendComplete(Index As Integer)
    bSending(Index) = False
End Sub


Private Sub Form_Load()
Dim i As Long
    'load controls for concurrently connections
    NumSockets = 100
    ReDim bFreeAccept(NumSockets)
    ReDim bSending(NumSockets)
    bFreeAccept(0) = True
    bSending(0) = False
    For i = 1 To NumSockets
        Load Accept(i)
        bFreeAccept(i) = True
        bSending(i) = False
    Next
    ConcurrentlyConnections = 0
    'config listen winsock
    Listen.LocalPort = 80
    Listen.Listen
End Sub

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #5 Добавлено: 15.02.06 18:06
Подправил код :
Dim Listen As Winsock
Dim Accept As Winsock

Теперь ругаеться на
Load Accept(i)

А если без димов - матерился на :
Private Sub Accept_DataArrival(Index As Integer, ByVal bytesTotal As Long)

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #6 Добавлено: 15.02.06 18:10
У мя VB 6 , это ничего ?

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #7 Добавлено: 15.02.06 18:13
Вобщем думаю будет проще выложить свой код , может вы найдете ошибку :

Private Const BASEPORT As Integer = 80     'базовый порт
Public Predmet, Statya  As String
Dim rcv As String


' загрузка формы
Private Sub Form_Load()

'порт Server сокета
      wscServer.LocalPort = BASEPORT
   
   'переводим Server сокет в режим прослушивания
      wscServer.Listen
BDform.Show
main.Hide
BDform.Hide
'addForm.Show
End Sub

' закрытие формы
Private Sub Form_Unload(Cancel As Integer)
   
   'закрываем сокет
      wscServer.Close
End
End Sub

' получение Server сокетом запроса на соединение от клиента
Private Sub wscServer_ConnectionRequest(ByVal requestID As Long)
      
   'передаем сокету соединение с клиентом
      wscServer.Close
      wscServer.Accept requestID

End Sub


' сокет получил данные
Private Sub wscServer_DataArrival(ByVal bytesTotal As Long)
    
   'получаем данные
      wscServer.GetData rcv, vbString
  ' В этом месте у меня идет обработка полученного
'        *********
   
    ' отправляем данные
      wscServer.SendData fileSt
 End Sub

'По окончании отправки разорвать соединение и снова слушать порт
Private Sub wscServer_SendComplete()
wscServer.Close
wscServer.Listen
End Sub

Ответить

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



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #8 Добавлено: 15.02.06 18:16
Такое впечатление что винсок через какое-то время виснет , но прога при этом работать продолжает. Я было подумал что какое-нибудь переполнение буфера , но данные посылаемые сокетом достаточно малы . Да и если идет вариант загрузки картинки вроде все пашет . А картинка на 3 метра , так что всё ОК быть должно. Но почему-то не ОК :(((

Ответить

Номер ответа: 9
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #9
Добавлено: 15.02.06 18:23
На форме лежит винсок Accept с индексом 0.
В коде он множится до сотни.

Ответить

Номер ответа: 10
Автор ответа:
 AsHeS



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #10 Добавлено: 15.02.06 18:26
Погоди , а винсок Listen не нужен ???

Ответить

Номер ответа: 11
Автор ответа:
 boevik



Хранитель чата

ICQ: 137392264 

Вопросов: 8
Ответов: 557
 Web-сайт: www.hypertech.ru
 Профиль | | #11
Добавлено: 15.02.06 18:30
Нужен, но он единственный.
В момент когда кто то стучится в сервак по порту 80, Listen передает управление свободному Accept-у

Ответить

Номер ответа: 12
Автор ответа:
 AsHeS



ICQ: 229759992 

Вопросов: 14
Ответов: 93
 Профиль | | #12 Добавлено: 15.02.06 19:07
Все , работает и глюков вроде бы не видно. Большое те человеческое СПАСИБО

Ответить

Страница: 1 |

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



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