Re: Передача структур данных через сокет
От: jobber_man Россия  
Дата: 19.12.07 16:52
Оценка: +1
Здравствуйте, BazaroffMA, Вы писали:

BMA>Снова мучаюсь с сокетами, не могу передать запись через сокет, вот мои класы и процедуры обработки:


BMA>класс и константы

BMA>
BMA>const

BMA>cmdAuth = 1;
BMA>cmdMessage = 2;
BMA>cmdExit = 255;

BMA>  type TNetPack = record
BMA>    Cmd:byte;
BMA>    UserID: ShortString;
BMA>    Pswd: ShortString;
BMA>    Param1:String;
BMA>  end;

BMA>



BMA>Когда делаю сервер и клиент на одной форме все отлично работает, а если делаю клиент отдельно, то при авторизации все нормально а при приеме сообщения Accec violation


BMA>помогите разобраться


Да тут все просто: String — это довольно сложный класс, в частности, внутри него хранится указатель на данные строки. Когда ты передаешь record, содержащую String, то у тебя передается только указатель, а не сами данные. Когда читаешь record, то, естественно, считывается только указатель, если принимаешь и посылаешь данные в разных процессах то естественно происходит ошибка, т.к. указатель, полученный в одном процессе, не имеет совершенно никакого смысла в другом. Если на одной форме работает, то это просто случайность, что полученный указатель указывает на данные отправленной строки.

В общем, при пересылке данных надо быть осторожным, и не пересылать указатели. Вместо этого надо пересылать данные объекта, на которые указывает указатель, например, в виде массива байт.
... << RSDN@Home 1.2.0 alpha rev. 786>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.