Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: Помогие. WinSock. UserControl. Run Time Error 28. Добавлено: 27.04.07 16:31  

Автор вопроса:  Programmer
Сделал свой сокет на основе WinSock. Для удобства. Вроде тьага сервера. Сделал в нем свойоство FilePath$().
Ктото коннектица - ReDim Preserver m_file(1 to Index).
Так вот. Мой прога получает файлы. Каждый раз, при получении сообщения, проверяеться, если свойство sock.FilePath(ID) = "", то оно присваеваеться, иначе данные записываються в файл. В один прекрассный раз, при сравнивании:
If Len(sock.FilePath(ID)) = 0 Then

я получил такое сообщение - недостаточно места в стеке, ошибка времени выполнения номер 28.
Что делать???

Ответить

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

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



Вопросов: 71
Ответов: 246
 Профиль | | #1 Добавлено: 27.04.07 16:33
Вот код моего socket`a:
Event Accepting(ByVal ID As Long, ByVal IP As String)
Event Closing(ByVal ID As Long, ByVal IP As String)
Event Data(ByVal ID As Long, ByVal IP As String, ByVal Data As String)
Dim m_port As Long, m_file$()
Public Sub Listen(ByVal Port As Long)
If ws.UBound <> 0 Then
For i = 1 To ws.UBound
Unload ws(i)
Next
End If
ws(0).Close
ws(0).LocalPort = Port
m_port = Port
ws(0).Listen
End Sub

Private Sub ws_Close(Index As Integer)
On Error Resume Next
RaiseEvent Closing(Index, ws(Index).RemoteHostIP)
Unload ws(Index): m_file(Index) = ""
End Sub

Private Sub ws_ConnectionRequest(Index As Integer, ByVal requestID As Long)
On Error Resume Next
n = ws.UBound + 1
Load ws(n): On Error Resume Next: ReDim Preserve m_file(1 To n)
m_file(n) = ""
ws(n).Accept requestID
RaiseEvent Accepting(n, ws(n).RemoteHostIP)
End Sub

Private Sub ws_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData$
ws(Index).GetData strData
If InStr(1, strData, ".SESSION";) = 0 Then
RaiseEvent Data(Index, ws(Index).RemoteHostIP, strData)
Else
s = Split(strData, ".SESSION";)
For i = 0 To UBound(s)
If Len(s(i)) <> 0 Then RaiseEvent Data(Index, ws(Index).RemoteHostIP, s(i))
Next
End If
End Sub

Private Sub ws_Error(Index As Integer, 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)
If Index <> 0 Then RaiseEvent Closing(Index, ws(Index).RemoteHostIP)
End Sub

Public Sub CloseThis(ByVal ID As Long)
On Error Resume Next
If ID <> 0 Then Unload ws(ID): On Error Resume Next: m_file(ID) = ""
End Sub

Public Property Get LocalHost() As Variant
LocalHost = ws(0).LocalHostName
End Property

Public Property Get ListenPort() As Variant
ListenPort = m_port
End Property

Public Property Get FilePath(ByVal ID As Long) As String
If ID = 0 Then Exit Sub
FilePath = m_file(ID)
End Property

Public Property Let FilePath(ByVal ID As Long, ByVal vNewValue As String)
On Error Resume Next
m_file(ID) = vNewValue
End Property

Public Sub SendData(ByVal ID As Long, ByVal Data)
On Error Resume Next
ws(ID).SendData ".SESSION" & Replace(Data, ".SESSION", "";)
End Sub

Ответить

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



Вопросов: 71
Ответов: 246
 Профиль | | #2 Добавлено: 27.04.07 16:35
Ошибка:

Private Sub sock_Data(ByVal ID As Long, ByVal IP As String, ByVal Data As String)
If Len(sock.FilePath(ID)) = 0 Then 'Примерно после
'тысячи вызовов, ошибка в этом месте.
sock.FilePath(ID) = Data
Else
'...............
End If

Ответить

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



Вопросов: 71
Ответов: 246
 Профиль | | #3 Добавлено: 27.04.07 16:38
Я заметил, что при уменьшении блока передачи за один раз (сейчас он у меня составляет 15000 байт), количество выполнений sock_Data() без ошибок увеличеваеться.
Если блок ОЧЕНЬ большой, комп виснит, как при DNS атаке.

Что делать?
Заранее спасибо.

Ответить

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



Вопросов: 71
Ответов: 246
 Профиль | | #4 Добавлено: 27.04.07 20:17
Все, сам все исправил. Кому интересно:
Процедура Sock_Data передавала Sneded и вызывала DoEvents. Клиент тут же отвечал новым куском файла, сервак повторял тот первый вызов и т. д.
Стек забивался и все.
Я убрал DoEvents из той процедуры и SendData "Sended". "Sended" я поставил в другое место.


Тема закрыта.

Ответить

Страница: 1 |

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



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