Страница: 1 |
Страница: 1 |
Вопрос: Проблема с моей прогой
Добавлено: 15.02.06 17:01
Автор вопроса: AsHeS | ICQ: 229759992
Только что закончил писать свою прогу и столкнулся с довольно-таки не приятным глюком :
Сама прога являеться http серваком в который встроенна электронная библиотека. Для исполнения http использовал винсок компонент ВБ. Информация храниться в базе данных Access и использую я её с помощью объекта дата. В основном код - обработка строк итд. Я конечно понимаю что такого описания мало , но код большой и разбираться в нем врядли кто-нибудь станет :(
Суть бага в том что после нескольких запросов Internet Explorer пишет что сервер более не доступен. Но при этом прога вроде как работает. Может кто знает что это может быть ???
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
boevik
Хранитель чата
ICQ: 137392264
Вопросов: 8
Ответов: 557
Web-сайт:
Профиль | | #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-сайт:
Профиль | | #4
Добавлено: 15.02.06 17:46
Скорее всего в этом проблема.
Код у меня примерно такой:
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 Accept As Winsock
Теперь ругаеться на
А если без димов - матерился на :
Номер ответа: 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-сайт:
Профиль | | #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-сайт:
Профиль | | #11
Добавлено: 15.02.06 18:30
Нужен, но он единственный.
В момент когда кто то стучится в сервак по порту 80, Listen передает управление свободному Accept-у
Номер ответа: 12
Автор ответа:
AsHeS
ICQ: 229759992
Вопросов: 14
Ответов: 93
Профиль | | #12
Добавлено: 15.02.06 19:07
Все , работает и глюков вроде бы не видно. Большое те человеческое СПАСИБО