Страница: 1 | 2 |
Вопрос: Работа WinSock и загрузка CPU
Добавлено: 21.06.04 17:15
Автор вопроса: x-jek
Ответы
Всего ответов: 28
Номер ответа: 1
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #1
Добавлено: 21.06.04 18:23
Код покажи... у тебя что-то не так в коде...
С винсоком все в норме...
Номер ответа: 2
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #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
'в цикле ждем, когда произойдет соединение, затем выходим из цикла
 o
'пустой цикл ожидания
 oEvents
Loop Until Winsock1.State = 7
MsgBox "Соединение установлено!"
'отправляем серверу ПЕРВОЕ число
Winsock1.SendData "0"
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
 im Строка As String
 im Число 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)
 im Строка As String
 im Число 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...
'в цикле ждем, когда произойдет соединение, затем выходим из цикла
 o
'пустой цикл ожидания
 oEvents
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-сайт:
Профиль | | #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-сайт:
Профиль | | #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 (именованные каналы)?