Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 | 2 |

 

  Вопрос: Работа WinSock и загрузка CPU Добавлено: 21.06.04 17:15  

Автор вопроса:  x-jek
Добрый день!
Кто-нибудь знает, как снизить загрузку проца при длительном  приеме (передаче) данных через WinSock, а то у меня уже при 8-ти работающих экземплярах Winsock'а, связанных с восемью разными компами (я пытаюсь сделать один распределенный алгоритм...) процессор загружен на 100% (!) и все восемь экземпляров начинают работать с периодическими остановками в приеме (передаче) данных. Причем, сам объем передаваемых данных невелик: клиент отсылает строку (из двух символов) серверу, а сервер, приняв эту строку, выполняет некоторое действие над ней и отсылает модифицированную строку (2 символа) клиенту, затем в цикле процесс повторяется снова, но уже со строкой других данных. Связь клиента и сервера должна поддерживаться постоянно.
Пробовал экспериментировать и вместо OCX-компонента WinSock'а использовал API - результат тот-же! Может это такая особенность VB6 пожирать ресурсы при работе WinSock? Для сравнения: всем известный RemoteAdministrator (версии 2.1) при передаче целого экрана (!) удаленной машины с частотой сканирования 100 раз в секунду при 65536 цветах съедает всего лишь 3-5% ресурсов проца. Если кто знает, как с этим бороться - подскажите!!!
С уважением, jek@stu.lipetsk.su
 

Ответить

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

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #1 Добавлено: 21.06.04 18:23
Код покажи... у тебя что-то не так в коде...
С винсоком все в норме...

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #2
Добавлено: 21.06.04 19:00
попробуй мой контрол newrate.boom.ru и скажешь, тормозит или нет.

Ответить

Номер ответа: 3
Автор ответа:
 x-jek



Вопросов: 2
Ответов: 11
 Профиль | | #3 Добавлено: 22.06.04 16:23
Добрый день Chill!
Привожу (адаптированный для показа здесь) пример моего кода:

'**************КЛИЕНТСКАЯ ЧАСТЬ******************
'(на форме клиента размещены: элемент Winsock с именем Winsock1, кнопка CommandButton с именем Command1, текстовое поле TextBox с именем TextBox1)
'Код формы
Private Sub Command1_Click()
   'устанавливаем протокол TCP/IP
    Winsock1.Protocol = sckTCPProtocol
   'устанавливаем адрес сервера
    Winsock1.RemoteHost = "127.0.0.1"
   'устанавливаем номер порта
    Winsock1.RemotePort = 1001
   'соединяемся с сервером...
    Winsock1.Connect
   'в цикле ждем, когда произойдет соединение, затем выходим из цикла
    ;Do
        'пустой цикл ожидания
         ;DoEvents
    Loop Until Winsock1.State = 7
    MsgBox "Соединение установлено!"
   'отправляем серверу ПЕРВОЕ число
    Winsock1.SendData "0"
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    ;Dim Строка As String
    ;Dim Число As Long
   'пришла строка данных
    Winsock1.GetData Строка
   'преобразовываем строку в числовое значение
    Число = Val(Строка)
   'для контроля выводим полученное число в TextBox на форме
    Text1.Text = Str(Число)
   'если полученное число достигло заданного значения (взято произвольное значение)
    If Число > 6000 Then
        'то выводим сообщение
         MsgBox "Обмен данными завершен!"
        'и закрываем соединение
         Winsock1.Close
         Exit Sub
    End If
   'увеличиваем числовое значение на единицу
    Число = Число + 1
   'и отправляем полученный результат обратно клиенту
    Winsock1.SendData Str(Число)
End Sub


'**************СЕРВЕРНАЯ ЧАСТЬ******************
'(на форме сервера размещен элемент Winsock с именем Winsock1)
'Код формы
Private Sub Form_Load()
   'устанавливаем протокол TCP/IP
    Winsock1.Protocol = sckTCPProtocol
   'устанавливаем номер порта
    Winsock1.LocalPort = 1001
   'слушаем порт...
    Winsock1.Listen
End Sub

Private Sub Winsock1_Close()
    End
End Sub

Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
   'закрываем старое соединение
    Winsock1.Close
   'принимаем запрос на соединение
    Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    ;Dim Строка As String
    ;Dim Число As Long
   'пришла строка данных
    Winsock1.GetData Строка
   'преобразовываем строку в числовое значение
    Число = Val(Строка)
   'увеличиваем числовое значение на единицу
    Число = Число + 1
   'и отправляем полученный результат обратно клиенту
    Winsock1.SendData Str(Число)
End Sub

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #4 Добавлено: 22.06.04 16:35
В данный момент смотрю твой пример...
Начинаю разбор...
1) нафига тебе ждать коннекта в цикле? Есть событие Winsock1_Connect...

  'в цикле ждем, когда произойдет соединение, затем выходим из цикла
    ;Do
        'пустой цикл ожидания
         ;DoEvents
    Loop Until Winsock1.State = 7
    MsgBox "Соединение установлено!"
   'отправляем серверу ПЕРВОЕ число
    Winsock1.SendData "0"
это все убирай и пиши
Private Sub Winsock1_Connect()
    MsgBox "Соединение установлено!"
   'отправляем серверу ПЕРВОЕ число
    Winsock1.SendData "0"
End Sub

у меня все тормоза сразу пропали...

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #5 Добавлено: 22.06.04 16:39
Кстати, ИМХО для твоих целей лучше использовать контрол от DaSharm'а, он мало весит, вкомпилируется в прогу(не придется за собой лишние файлы таскать)... а главное, все сделано граммотно и быстро работает, т.к. использовались winsock api...
Удачи, если глюки так и ен пропали - пиши...

Ответить

Номер ответа: 6
Автор ответа:
 x-jek



Вопросов: 2
Ответов: 11
 Профиль | | #6 Добавлено: 22.06.04 17:12
Привет еще раз!
1) спасибо что сразу откликнулся и ответил мне;
2) сразу сделал то, что ты сказал.
В результате - то же самое и загрузка проца при передаче данных опять равна 100%!!!

Чтобы убедиться в этом, попробуй запустить виндовый ДиспетчерЗадач и погляди в нем на вкладку Быстродействие: там во время передачи данных все наглядно показано!
И если одновременно запустить еще 4 таких же пары "клиент-сервер", то ни одна пара СТАБИЛЬНО работать не будет. По крайне мере, у меня именно так! (перед тем, как будешь так делать, измени в клиентской части в строке
'если полученное число достигло заданного значения (взято произвольное значение)
    If Число > 6000 Then

значение 6000 на что-нибудь побольше, например 36000, чтобы процесс передачи шел дольше)

Не могу понять одного: почему у тебя прога не тормозит, а у меня (откорректированная по-твоему) продолжает работать по-прежнему, т.е. со 100% загрузкой CPU ?

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #7 Добавлено: 22.06.04 18:05
Я не запускал сразу несколько серверов, сейчас попробую...

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #8 Добавлено: 22.06.04 18:14
2 сервера, как я и предпологал не запускаются...
Error: "Address in use..."

Несколько клиентов при передаче действительно загружают проц на 100%...
Буду думать... я вообще писал сервер использую C и winsock api... при этом работа с каждым клиентом шла в отдельном потоке, нужно посмотреть как работает winsock.ocx c несколькими клиентами...

Ответить

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



ICQ: 554200 

Вопросов: 101
Ответов: 343
 Профиль | | #9 Добавлено: 22.06.04 18:21
Я ступил... к твоему серверу одновременно может подключиться только один клиент... это ИМХО не правильно, посмотри примеры на сайте, как сделать многоклиентный сервер...
для этого нужно создать слушающий сокет и при появлении на нем запроса на соединение создавать еще один сокет, который и будет общаться с клиентом...

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #10
Добавлено: 22.06.04 19:08
Для многих клиентов лучше использовать мой "Тяга-сервер" localhost.co.nr/ts.rar . Кстати, если те нужет будет асинхронный движок типа "Тяга", то вышлю новую "Тягу 2.0".

Ответить

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


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #11 Добавлено: 22.06.04 19:38
2 DaSharm Твоя теяга недоработанная (без обид), выложи новую, пускай все качают.

Ответить

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



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #12
Добавлено: 22.06.04 22:14
Никаких обид, я знаю, что тяга версий 1.0 и 1.5 полное говно.и даже Тяга 2.0 (которая покоиться у меня на винте) тоже говно!Я написал новый контрол, ето воплощение всех моих знаний winsockAPI, теперь "Тяги" не существует, я дал етим пконтролам новое имя: "VBSocket". Итак, самый первый из VBSocket'ов ето асинхронный ТСР движок с максимально упрощенным кодом, практически (мне ещё не встречались) без багов.Выложу птом, сейчас он проходит бета тестинг.

Ответить

Номер ответа: 13
Автор ответа:
 x-jek



Вопросов: 2
Ответов: 11
 Профиль | | #13 Добавлено: 23.06.04 19:09
Снова приветствую всех!

После прочтенного 8-го и 9-го ответов я понимаю, что мы говорим о разных вещах...

Это я к тому, Chill, что мне НЕ требуется, чтобы к серверу подключались НЕСКОЛЬКО клиентов. Все как раз наоборот... Сейчас попробую все подробно изложить.
В самом начале нашего разговора (в своем первом сообщении), я сильно упростил ситуацию с клиентом/сервером и представил Вам лишь МОДЕЛЬ той системы, которую сейчас пишу...
В реальности, ВСЕ СЕРВЕРЫ (в идеале их может быть до 100 штук, а не ОДИН, как в классических системах клиент/сервер!) разбросаны на РАЗНЫХ компах в локальной сети (100 МБит) нашего университета, причем каждый сервер выполнен в виде самостоятельной виндовой СЛУЖБЫ (с ее реализацией я очень долго возился), запускающейся при запуске Windows и работающей без вмешательства ЛОКАЛЬНОГО пользователя этого компа. Сама служба на компе, с "сетевой" точки зрения, представляет из себя (как уже было сказано выше) ОДИН СЕРВЕР, прослушивающий один определенный порт (с адресом выше 65000) и ожидающий подключения ОДНОГО ЕДИНСТВЕННОГО КЛИЕНТА. Ни о каких многоклиентных сервере и речи не идет! Наоборот, здесь лучше говорить, если можно так выразиться, о многосерверном клиенте (извините за каламбур). Так вот, после подключения к нему клиента, этот сервер может принимать и выполнять НАБОР нужных мне КОМАНД (связанных с рутинными научными вычислениями и сопровождаемых требуемыми для этого ДАННЫМИ), получаемых от клиента, и реализованных в виде некоего самодельного ПРОТОКОЛА. А результат этих научных вычислений отсылается ОБРАТНО КЛИЕНТУ, т.е. на мою машину. Причем в целях автономности самой службы, в случае аварийных отключений клиента, на каждом сервере я предусмотрел автоматический переход в режим ожидания нового подключения клиента (чтобы не бегать по университету и не перезапускать службы на всех компах).
Теперь о клиентской части.
Клиент - ОДИН и расположен он на моей машине (реализован в виде ActiveX EXE, что позволяет без особых проблем создавать потоки) в этой же локалке университета. Он одновременно отсылает КОМАНДУ и ДАННЫЕ для ее выполнения ВСЕМ СЕРВЕРАМ, а затем ждет от них результата (ответа). Связь клиента с серверами должна быть постоянной. И вот на этом месте меня и поджидал облом: при длительном приеме/передаче информации, уже даже при ОДНОМ ПОДКЛЮЧЕННОМ СЕРВЕРЕ, процессор, загружен на 100% и речи о подключении остальных и быть не может!!! Хотя в остальном, всю систему я тщательно продумал и многие возникающие во время работы проблемы были мной решены.
Да, кстати о потоках: каждый экземпляр Winsock'а на КЛИЕНТЕ выполняется в ОТДЕЛЬНОМ ПОТОКЕ, т.е. система МНОГОПОТОЧНАЯ. Для этого использую ActiveX EXE (с ним особых неудобств пока не встретил). Разделить выполнение кода на отдельные потоки мне пришлось тогда, когда я только впервые столкнулся со 100% загрузкой CPU при работе Winsock'а (с моей теперешней главной проблемой), т.к. я решил (и вскоре это предположение оказалось неверным), что один поток выполнения не позволяет гонять несколько Winsock'ов и причина именно в этом... Ничего подобного, даже реализованная многопоточность не спасла положения.

P.S. Вчера я решил попробовать использовать Тягу от DaSharm'а: быстро слепил одиночный клиент/сервер и повторил "опыт" с передачей данных. Результат тот же - ресурсы CPU съедены полностью!!! Хотя вначале была надежда на то, что использование Тяги решит проблему... (при использовании Тяги обнаружился один глюк, о нем скажу позже)

Уфф... устал набивать...
 
Неужели с таким глюком раньше никто не сталкивался ???
Мужики! Может быть все-таки есть решение проблемы?

Ответить

Номер ответа: 14
Автор ответа:
 x-jek



Вопросов: 2
Ответов: 11
 Профиль | | #14 Добавлено: 24.06.04 09:29
Охо-хо!
Вижу, мой вопрос поставил всех в тупик...

Неужели нет спецов по данной теме ?

Ответить

Номер ответа: 15
Автор ответа:
 x-jek



Вопросов: 2
Ответов: 11
 Профиль | | #15 Добавлено: 24.06.04 09:36
Кстати, пробовал ли кто-нибудь работать с такой зверюшкой от Microsoft, как Named Pipes (именованные каналы)?

Ответить

Страница: 1 | 2 |

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



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