![]() |
|
Модераторы: Snowy, Poseidon, MetalFan |
![]()
|
|
| VanHelsing |
|
||||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Код модуля сервера:
Код модуля клиента:
При подключении клиента к серверу происходит ошибка, которая разрывает соединение. При пошаговом запуске программа останавливается на строке
Скажите пожалуйста что неправильно? |
||||||
|
|||||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
msClient.Write(StructC,sizeof(StructC));
string - это указатель на данные соотв. sizeof(StructC) будет 1+4+4+4+4+4+4+1 = 26 байт передаешь только указатель Тут несколько путей, например, вместо string сделать массив array[1..255{размер для примера}] of char;, вместо record - packet record Соотв. будут проблемы -передаваться лишние данные и(или) не хватит массива на большую стоку |
|||
|
||||
| BaD_SeCt0R |
|
|||
![]() Lazy Coder ![]() ![]() Профиль Группа: Участник Сообщений: 432 Регистрация: 9.10.2006 Где: Анапа Репутация: нет Всего: 18 |
-------------------- Кто владеет информацией - владеет миром. (С) Френсис Бэкон. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Не совсем понял что это дает. Получается просто один тип поменять на другой? |
|||
|
||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Клиент передает не строку, а указатель, где строка лежит в памяти клиента.
Сервер берет этот указатель и пытается прочитать строку у себя в памяти, и естественно выдает ошибку. |
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Ну допустим изменю структуру:
Искал информацию, но безуспешно. В чем разница? Передавать указатель на string или char? А packed record просто оптимизирует память. Это единственный вариант? Просто если использовать массив Char, то возникает дополнительная трудность с преобразованием. |
|||
|
||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
> В чем разница?
В одном случае передается строка (именно блок символов), в другом - нет. Совсем забыл: вместо Array[1..5] of Char можно писать string[5], так даже проще будет |
|||
|
||||
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Я переделал. Клент:
Сервер:
Все равно выскакивает таже ошибка. Пробовал писать в значения тип char, все равно не получается. Даже не знаю что сделать. |
||||
|
|||||
| Matematik |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Подозреваю что тут
переменная msS.Memory равна nil. Память надо выделять под буфер:
|
||||
|
|||||
| VanHelsing |
|
||||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Matematik большое спасибо, но получилось не все.
Сервер:
Клиент:
Ошибки больше вылазит, но данные все равно не передаются. В итоге после записи в структуру записи чей тип равен типу string[], равны пустому значению, а поля с цифровым значение передаются? Это сообщение отредактировал(а) VanHelsing - 27.9.2008, 06:35 |
||||
|
|||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Помогите пожалуйста. Правда хочу разобраться!
|
|||
|
||||
| Matematik |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1027 Регистрация: 11.3.2006 Репутация: 24 Всего: 50 |
Не знаю, попробуй передавать без MemoryStream, у меня код работает
|
|||
|
||||
| VanHelsing |
|
|||
![]() ХОЧУ ВСЕ ЗНАТЬ!!! ![]() ![]() Награды: 1 Профиль Группа: Участник Сообщений: 288 Регистрация: 3.1.2008 Где: Екатеринбург Репутация: нет Всего: 6 |
Matematik спасибо. Теперь разобрался. Начал все усложнять и зачем-то использовал TMemoryStream.
P.S. надеюсь теперь точно все! |
|||
|
||||
| Gwire |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 216 Регистрация: 7.8.2007 Где: Николаев Репутация: нет Всего: 4 |
Пост, конечно, очень старый... Но все же хочется поделится самым простым способом выделения буфера для сокета.
С начала, хочу сказать, что "string" и "array of <тип>" взяты под котроль "Borland memory manager" (для тех кто не знал). Выденная для них память автоматически освобождается, если ни одна переменная не не указывает на нее. Пример:
То что "string"("array of") указатель это не проблема, данные физически начинаются с первого(нулевого) елемента.
Для чтения из сокета - аналогично. SetLength -> Recv -> Finalize Этот метод очень удобен для данных с неопределеной заренее длиной. P.S. Если данные стуктурированные ("record" или "packed record") @Data[1] присваеваем в указатель на структуру. P:= @Data[1]; где P : {например} ^TstructChat; Заполняем или считываем через P^ |
||||
|
|||||
| cat512 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 438 Регистрация: 20.3.2007 Репутация: нет Всего: 15 |
Только под контролем не "Borland memory manager - а" a, самого компилятора! Менеджеру памяти абсолютно пох. есть ли ссылки на какую-то строку или нет. Он выполняет только команды по выделению/освобождению памяти, а также оптимизирует структуру для быстрого доступа к нужным объктам и выделения памяти. Автоматическое управление временем жизни некоторых "объектов", возложенно на компилятор. Он генерит код (rtl), который говорит МП, когда тот должен выделить/освободить память |
|||
|
||||
![]()
|
| Правила форума "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. |