![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
кстати мне sleep(10) очень помогло впринципе засыпание на 10 мс незаметно, это ни как не влияет на приём данных... а вот в цикле с GetticCount самое оно. Загрузка ЦП при 20 подключ. клиентов составила 0-1% при опросе клиентов каждые 3 сек. Провёл тестирование подключил 20 клиентов, и они стабильно обменивались данными с сервером 7-8 часов при закрытии серва все 20 клиентов были на связи. Пока ошибок не выявил.
Это сообщение отредактировал(а) Antony41 - 18.2.2013, 16:39 |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Короче тут такая ситуация вышла... Я запарился с этими vcl (TClientSocket) и решил с чистого листа на Socket API впринципе пока все прекрасно...
Вопросик образовался: Я Выполняю прием данных в основном потоке тоесть
пока выполняется эта функция, блокируется главный поток на время приёма данных. (ну я имею ввиду зависание интерфейса). никакие тут ProcessMessages не помогают, Что будет если я работу и прием данных напишу в отдельном потоке? ни каких конфликтов не возникнет при переключении потоков системой? или что посоветуете. |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Antony41, есть неблокирующий режим, есть select. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
ок спс... щас поюзаем
Добавлено через 10 минут и 26 секунд блин... чето я запутался немного. неблокирующий сокет создает отдельный поток на каждое подключение, так не будет ди тоже самое что я буду использовать блокирующий сокет в отдельном потоке, просто создам поток и суну туда все функции работы с сокетом.? |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Ребят помогите чёто не пойму как надо. Вот процедура приема данных у клиента
проблема в том что иногда структура не верно заполняется, а иногда верно. Если проверять когда данные от сервера ушли уже точно, то пакет приходит нормально, а вот если не ушли или ушли не полностью то иногда пакет поступает в обработку (processing()) и обрабатывается не верно. Короче серв шлет тестовый пакет каждые 5 сек, если я буду проверять пришел пакет или нет каждые 5 сек, то ошибки обработки (тут не понятно данные вроде по размеру заполнятся полностью, может там какие нибудь спец симполы в начале или конце пакета добавляются?) А если я буду делать проверку ReceiveNBytes каждые напр. 6-7 сек то всё ОК.
|
|||
|
||||
| Чучмек |
|
||||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Antony41, не выдумывай.
Добавлено через 13 минут и 52 секунды Нажми несколько раз подряд на Button1. Antony41,неблокирующий режим для того и существует, чтобы обойтись без дополнительных потоков. Есть как минимум один способ на блокирующем режиме - проверять состояние сокета через select (посмотри выше, я давал пример где проверялось подключение), и есть несколько способов на неблокирующих. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
||||
|
|||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
Просто терпения нет хочется быстрее выучить и написать уже рабочую нормальную прогу...))) Пошел снова читать)))
|
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
завтра если будет время перепишу всё под неблокирующий. посмотрим что из этого выйдет.
тут я так понимаю select timeout для recv задавать не нужно, так как прием данных будет возникать по событию FD_READ и вечного ожидания данных не будет? |
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Да. WSAAsyncSelect "привязывает" оконное сообщение к сокету(или, точнее, события сокета к оконному сообщению) и переводит сокет в асинхронный(неблокирующий) режим. Можно привязать одно или несколько событий FD_xxx. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
чот то не выходит,
Чучмек,
Почему так то разве если пакет придут по частям то ведь эта функция сработает не корректно, ведь у нас buff:array[word] of ansichar; определяется каждый раз заново короче я не пойму я уже всё сделал в одном основном потоке, сделал привязал событие FD_READ к сообщению всё ок при отправке данных, событие возникает нормально при чём сообщение которое отправляется обрабатывается несколько раз, и приходит нужное число байт, но буфер пустой(((( как правильно принимать рубленные пакеты в асинхронном режиме а именно буфер каких нибудь байт.... блин честное слово запарился, проект пользуется спросом а я не могу тут передачу данных наладить(((Что ж всё так печально то, уже и на стандартные компоненты забил засунулся в API а толку... Добавлено через 4 минуты и 4 секунды код не могу предоставить на работу нужно вечером помучаюсь еще на так я и не понял... блин Хелпинг... |
||||
|
|||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Ты все правильно понимаешь. Пример на неблокирующий режим и только. Конечно, буфер для сборки пакета должен быть глобальным. Как глобально Memo1. Кроме того, если возможно несколько соединений одновременно - под каждый сокет должен быть свой буфер. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
блин приходит пустой пакет(((( как правильно принять данные в ассинхронном режиме не блокирующем?
|
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
если поставить например вместо if iStillToReceive = 100 then, iStillToReceive = SizeOf(Buff) или 200 то данных в структуре нет, мало того еще и ошибка, а вот если сто +- то читается нормально и там те данные которые я передал |
|||
|
||||
| Antony41 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 332 Регистрация: 27.12.2008 Репутация: нет Всего: 1 |
тоесть не не так, получается если я ставлю размер принимаемого буфера Buff: array [0..500] of Char; то всё пока нормально приходит
а если поставить уже Buff: array [0..1000] of Char, то уже пустой буфер. как так
|
|||
|
||||
| Чучмек |
|
|||
|
НЭТ БИЛЭТ ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 11.5.2008 Где: СССР Репутация: 4 Всего: 41 |
Ты ведь пакет собираешь.
Пришел первый кусок (меньше чем указываешь в recv) -сумма меньше. Пришел второй кусок -сумма уже больше. -------------------- умную мысль держи при себе, а дурной - поделись с другими |
|||
|
||||
![]()
|
| Правила форума "Delphi: Сети" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |