winsock не успевает обрабатывать несколько соединений

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

winsock не успевает обрабатывать несколько соединений

Сообщение dklmn » 23.05.2005 (Пн) 11:35

Я написал серверную программку, с массивом винсок контролов.
При событии ConnectionRequest к массиву добавлятеся сокет
- который собснно и осуществляет обмен с клиентом.
Пока у меня идет одно соедиение все проходит на ура.
Но, когда я моделирую ситуация с несколькими коннектами
- то сервер не хочет должным образом обрабатывать второй коннект
- то есть он создает для него новый сокет-
- успевает что то от него принять
- но обработать эту посылку и послать ответ уже не желает.
так как занят разговором с первым клиентом - при этом загруженность процессора нормальная.
Приходится вводить на клиенте искуссвенную паузу между посылкой строк, только тогда сервер способен обработывать паралельно и приходящие данные со второго клиента.
Как нибудь можно иначе эту проблему решить?
Мне пока ничего в голову кроме как писать все на АПи функциях и создавать для каждого коннекта отдельный поток не приходит..

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

код

Сообщение dklmn » 23.05.2005 (Пн) 15:11

ну там работает массив винско конролов
код такой
Код: Выделить всё

Private Sub tcPServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim lastS As String
       Dim strToObr As String 'цельная строка передаваемая обработчику
       Dim NTerm As Integer 'число терминальных символо в строке
       Rbuff = ""
       Dim dlS As Integer
    tcPServer(Index).GetData Rbuff
     Debug.Print bytesTotal & "bytes received from client index " & Index
     Log_Event bytesTotal & "bytes received from client index " & Index
     StrToCome = StrToCome & Rbuff
     
     NTerm = L(StrToCome, TERM)
    If NTerm > 1 Then 'если есть терминальные символы
      strToObr = Piece(StrToCome, TERM, 1, NTerm - 1)
      StrToCome = Piece(StrToCome, TERM, NTerm)
      ObrabInStr tcPServer(Index), strToObr  'передаем собранную строку (или часть строки)обработчику
    Else
   
   
    End If
End Sub

то есть там приходят строчки накапливаются пока не не встритит терминальный символ ( у меня данные идут с покет ПиСи а там винсок данные рвет как тузик тряпку иногда)
как только терминальный символ встетили то накопленная строка передается обаботчику
ObrabInStr

Код: Выделить всё

Private Function ObrabInStr(curWS As Winsock, InString As String)
'обработчик проиходцщей строки curWS - элемент винсок массива из которого пришла строка
Dim n As Integer
Dim wsPar As String
Dim subStr As String
Dim strType As String 'тип строки
Dim strDann As String 'данные в строке
Dim tpKod
Dim ret As String 'список номеров заявок для возврата
For n = 1 To L(InString, TERM)
    subStr = Piece(InString, TERM, n)
    strType = Trim(Piece(subStr))
    strDann = Piece(subStr, DIV, 2, L(subStr, DIV))
      If subStr <> "" Then
      txtRdata.Text = txtRdata.Text & subStr & vbCrLf
     
      Select Case LCase(strType)
        Case "0"  'если первым писом идет ноль то то сигнал что надо прикрыть сокет
        wsPar = curWS.Index
        'curWS.SendData "сокет закрывается" & DIV & wsPar & TERM & vbCrLf
        curWS.Tag = ""
        curWS.Close
        Unload curWS
        Log_Event "Connection  " & wsPar & " Closed"
     
         Case "1"  'если это строка с данными заявки
          Dim flName As String
          Dim fileNum As Integer
         
          Dim OrdKey 'код заявки
          flName = Trim(Piece(curWS.Tag, DIV, 2))
          ret = Trim(Piece(curWS.Tag, DIV, 3)) 'Третьим полем собираем номера заказов
          tpKod = Piece(curWS.Tag)
           If Trim(tpKod) <> "" Then
               fileNum = FreeFile
               If flName = "" Then
                    'ecли файл еще не создан
                    tpKod = Piece(curWS.Tag)
                    flName = App.Path & "\" & tpKod & "\" & MDT() & ".txt"
                    Open flName For Output As #fileNum 'создали файл
                    Print #fileNum, strDann
                    curWS.Tag = SetPiece(curWS.Tag, flName, DIV, 2)
                    'первой строкой идет определение полей - по нем ответ не обязателен
              Else  'ecли файл уже создан
                    Open flName For Append As #fileNum
                    Print #fileNum, strDann
                    OrdKey = Piece(strDann)
                    ret = ret & OrdKey & "$"
                    curWS.Tag = SetPiece(curWS.Tag, ret, DIV, 3)
              End If
          Close fileNum ' тут же закрыли
       
             
             
           Else 'если строка с данными уже пришла а код тп не определен
             
               WriteLog "Код ТП не определен! Пришла строка", LogFileName, subStr
          End If
         
          Case "2"  'если это код тп
          tpKod = Replace(Trim(Piece(strDann)), "/", "_")  'преобразуем код тп так чтобы создать из него имя папки
          'If Dir(App.Path & "\" & tpKod) = "" Then MkDir App.Path & "\" & tpKod
          On Error Resume Next
            MkDir App.Path & "\" & tpKod
          On Error GoTo 0
          curWS.Tag = SetPiece(curWS.Tag, tpKod, DIV, 1)
          WriteLog "Код ТП", LogFileName, tpKod
          Case "-1"  'если это metka окончания передачи файла
           ret = Trim(Piece(curWS.Tag, DIV, 3)) 'Третьим полем собираем номера заказов
          curWS.SendData "OK" & DIV & ret & TERM
           Log_Event "send data from  " & curWS.Index & " :" & "OK" & DIV & ret & TERM
        Case "hello"
        curWS.SendData "ready" & DIV & TERM
         Log_Event "send data from  " & curWS.Index & " :" & "ready"
        Case Else
        WriteLog "Пришла строка", LogFileName, subStr
        'curWS.SendData "OK" & DIV & Left(subStr, 10) & TERM & vbCrLf
       End Select
    End If
Next n
End Function

Но для второго коннекта
обработчик уже не вызывается
то есть не знаю, может и вызывается но не успевает ничего обработать
По крайней мере когда я посылаю на сервер "hello" и обработчик должен сказать "ready" то для второго конекта выполняется

Log_Event bytesTotal & "bytes received from client index " & Index

из DataArrival

но НЕ выполняется
Код: Выделить всё

curWS.SendData "ready" & DIV & TERM

         Log_Event "send data from  " & curWS.Index & " :" & "ready"

А когда вводишь задержку на клиенте между посылками на сервер
- то все работает как надо.[/syntax]

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.05.2005 (Пн) 15:52

Погляди мою статью на сайте, может пригодится.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 23.05.2005 (Пн) 17:33

Не знаю, насколько это применимо здесь, но Винсок из VS6 SP0 имеет глюк, из-за которого данные уходят только через один из Винсоков, даже если их много. Исправлен, кажется, в SP3.
dklmn, посмотри - может в этом дело?
Изображение

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

у кого SP3 посмотрите какая у вас версия винсок контрола

Сообщение dklmn » 24.05.2005 (Вт) 10:09

tyomitch писал(а):Не знаю, насколько это применимо здесь, но Винсок из VS6 SP0 имеет глюк, из-за которого данные уходят только через один из Винсоков, даже если их много. Исправлен, кажется, в SP3.
dklmn, посмотри - может в этом дело?

Народ, не сочтите за труд, у кого SP3 посмотрите какая у вас версия винсок контрола плиз...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.05.2005 (Вт) 10:34

После названия "Winsock Control" в списке контролов идёт его SP в скобках.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.05.2005 (Вт) 11:24

У меня SP3 и версия 6.0.81.69
Скобочек после названия нет.

А вот та статья: http://support.microsoft.com/default.as ... -us;245159 Там написано, что SP3 недостаточно - нужен SP4 :-)
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 24.05.2005 (Вт) 12:24

А у меня написано Microsoft Winsock Control 6.0 (SP6) :)

И в каждом дескрипшене каждого SP пишут, что устранили очередной баг в этом контроле :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

не сильно затруднит выложить файлик с винсоком из sp 6

Сообщение dklmn » 24.05.2005 (Вт) 13:42

GSerg писал(а):А у меня написано Microsoft Winsock Control 6.0 (SP6) :)

И в каждом дескрипшене каждого SP пишут, что устранили очередной баг в этом контроле :)

а ... не сильно затруднит выложить файлик с винскоком из шестого сервис пака...
а то я посмотрел там под 30 метров качать...
может поможете.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.05.2005 (Вт) 20:04

GSerg писал(а):И в каждом дескрипшене каждого SP пишут, что устранили очередной баг в этом контроле :)

Ет точно... В одном из KB написано что-то вроде "если вам нужен реально производительный и надёжный сервер, выбросьте mswinsck.ocx и пишите на VC :-)"
Такое мегабажище, что абыдно ;-(
Изображение

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 24.05.2005 (Вт) 21:16

To: dklmn

Мой тебе эдвайс и риспект - ищи баг в коде.
Винсок отлично справляеться с 0.5 к клиентов 8).

--
Насколько я понял - инициализация + загрузка сокета проходит в момент
запроса нового соединения.

Это (!) я не уверен может отнимать много времени, а так как сообщения
от сокета идут в виде "сообщений" - ты рискуешь НЕ получить эти сообщения
в связи с перегрузкой очереди (я зубы обломал в другом месте зубы 8))).

Я много и по-разному работал с сокетами ...
что порекомендую:

1. Перенеси декларацию буферов и переменных на уровень модуля - глобально.
2. Уменьш до минимума код обработчиков.

ИМХО лучше делать не так, а так:

0. Создать массив Классов-обработчиков.
1. Загрузить СРАЗУ 50 сокетов с классами и привязать их к обработчикам.
2. При Incoming Connect проверять какой обработчик свободен -
в каждом должно быть b_IsBuisy. Если свободен - связываем и
передаём управления

2 tyomitch:

ИМХО winsock отнюдь не СТОЛЬ бажен. я вешаю 300 клиентов на один сервак
и ничё - работают как негры. VC? ИМХО лажа. Чем хуже АПИ Сокет на ВБ +
грамотный код? - Ничем!

2 dklmn - выложи код. Хотю глянуть. 8) Эсли можна кАнешно! 8)
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 24.05.2005 (Вт) 22:11

xenomorph писал(а):ИМХО winsock отнюдь не СТОЛЬ бажен. я вешаю 300 клиентов на один сервак
и ничё - работают как негры. VC? ИМХО лажа. Чем хуже АПИ Сокет на ВБ +
грамотный код? - Ничем!

1. Самый страшный из всех багов Винсока - потеря пришедших, но не прочитанных, данных при обрыве связи. Очень долго меня обламывает.
2. А чем он тогда лучше? Кроме того, что на VB? :-)
Изображение

dklmn
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 23.03.2004 (Вт) 12:21

да вроде и так заработало

Сообщение dklmn » 30.05.2005 (Пн) 15:18

xenomorph писал(а):To: dklmn
2 dklmn - выложи код. Хотю глянуть. 8) Эсли можна кАнешно! 8)

ну я в принципе проблему свою решил.
передела код наподобие того как это в статье уважемого Алибека
-http://www.vbstreets.ru/VB/Articles/65986.aspx
и все тьфу-тьфу тьфу заработало без сервис паков
Но если интересно могу коду выслать.[/url]


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 162

    TopList