![]() |
|
|
![]()
|
|
| Wolf |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 9.6.2006 Где: Нижневартовск Репутация: нет Всего: нет |
Доброго времени суток!
При изготовлении клиет-серверного приложния на компонентах ServerSocket ClientSocket постоянно возникают проблемы. Возникают при интенсивном обмене данными между клиентами. Задача состоит в том, как бы принять пакет данных используя OnClientRead и OnRead и обработать его. И тут начинают твориться такие странности, что сложно даже понять - откуда исходит ошибка. Подскажите, какую модель ввода-вывода используют борландовские сокеты в неблокирующем режиме? И почему в неблокирующем режиме, обрабатывая всех клиентов в одном потоке функция OnClientRead может запуститься во время выполнения самой себя (судя по всему если от клиента приходит очередной пакет). Вот код приёма пакета на сервере. Сначала в критической секции определяется клиент из списка. Структура клиента тоже прилагается. Приём первых 4 байтов, в которых указана длина пакета. Далее в 10 байтах название команды в протоколе, ну и данные далее. Структура Client
Код приёма на сервере
Приблизительно тоже самое на клиенте только без определения того, кто отправил
Кто сталкивался или знает как правильно принимать пакеты, подскажите пожалуйста. Бду крайне признателен. |
||||||
|
|||||||
| Wolf |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 9.6.2006 Где: Нижневартовск Репутация: нет Всего: нет |
В общем, почитал литературку. Кому интересно: компоненты TServerSocket & TClientSocket в неблокирующем режиме работают в модели перекрытого ввода-вывода используя для уведомления готовности чтения-записи функцию обратного вызова, которая запускается в главном потоке программы, при условии если поток Sleep. Тоесть гдето борландовцы вставили слип в цикле обработки сообщений. И в целом, это почти самое ужасное что я когда либо видел. Не используйте борланд компоненты TServerSocket & TClientSocket в неблокирующем режиме. Лучше вообще не используйте борланд сокеты.
|
|||
|
||||
| dumb |
|
||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 32 Всего: 158 |
ссылку на литературу - в студию!
исходники вышеозначенных компонент лежат в папочке Source\vcl, немного почитав которые, становится очевидным, что компоненты TServerSocket & TClientSocket в неблокирующем режиме НЕ работают в модели перекрытого ввода-вывода. а главная проблема в твоем коде - попытка чтения всех(еще не "приехавших") данных, вместо того, чтобы вычитать столько, сколько пришло - Socket->ReceiveLength(). |
||||
|
|||||
| Wolf |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 9.6.2006 Где: Нижневартовск Репутация: нет Всего: нет |
dumb, Ну, я понимаю, что проще ответить неопределённо, чем ответить конкретно на вопросы. Если не перекрытый ввод-вывод, то каким образом запускается функция в главном потоке, причём прерывая выполнение потока?
Я нашёл статью в инете, в которой был описан принцип действия перекрытого IO. Исходя из описанного я и сделал вывод. Громкие заявления сделаны после того, как я переписал всё на апи, у меня это отняло не много времени и я понял, что это не сложнее. Более того, отсутствуют абстракции от апи кода. Тоесть ты точно понимаешь, как и что у тебя работает. Там где тебе нужно, как нужно обрабатываются ошибки. Какие хочешь модели, сколько хочешь потоков в пуле.
Если всё было бы просто, я бы не писал. Я в этом проблемы не вижу. Да и к тому же, всё это проверялось. Опять же неопределённый ответ... "Главная проблема.... а вообще проблем так много в твоём коде....".
Вот этого не знал. Я программирую на VC++ по этому не особо где что. А вот ещё. Название файлика, пожалуйста
Если не затруднит, конечно. Это сообщение отредактировал(а) Wolf - 8.4.2009, 07:11 |
||||||
|
|||||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
Дык настоящий визуальщик пишет на голых сокетах Хочу предупредить - исходник написан на Паскале. Интерес не угас? А вообще в Бормане, имхо, рулят Indy. Если уж что и копать, то именно их. |
|||
|
||||
| Wolf |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 90 Регистрация: 9.6.2006 Где: Нижневартовск Репутация: нет Всего: нет |
mrbrooks,
Я уже переписал на голых сокетах
Просто думал облегчить себе труд... Оказалось всё наоборот. Вообще сейчас в программе из VCL я оставил только интерфейс. И тут я ругался на этот ВЦЛ. Когда на апи писал потоки и функции обработки клиента. Оказалось, что так просто не изменить интерфейс из другого потока. Нужно придумывать аналог функции Synchronize(). А он реализован в VCL таким нелепым образом... Короче, и интерфейс и не интерфейс в следующий раз буду печатать, а не щёлкать |
||||
|
|||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |