![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
имхо нельзя передавать борландовские строки через сокет. В дельфях это встроенный тип, в C++ скорее всего смарт поинтер, указатель на данные. А сами данные строки находятся в другой области памяти и не передаются.
здесь явное нарушение безопасности типов. Странно, что потом не выскакивает Access violation, но ничего, потом выскочит ![]() Хотите передать 3 строки за раз, придётся сначала перевести строки в char* , PChar или PAnsiChar потом скопировать все 3 строки друг за другом в 1 блок памяти и передавать этот блок целиком. С помощью "C" структур так сделать нельзя, потому что только последнее поле структуры может иметь вариабельный размер. Я бы сделал по-другому, написал 2 функции: sendMessage() и recvMessage() похожие на send() и recv() , только вместо аргументов buf и length аргумент типа Message. внутри этих функций 3 раза (для MsgType,MsgIP и MsgText) вызываются соответственно sendString() и recvString() в sendString() в сокет сначала посылаете 4 байта (длину строки ) потом данные типа Pchar в recvSring() из сокета сначала читаете 4 байта (длину строки , len ) потом !в цикле! читаете в буфер типа PChar и не забывайте, что может понадобиться несколько вызовов recv, чтобы прочитать всю строку. Выставляете нолик в последнем байте буфера (buf[len]) и конвертируете PChar обратно в AnsiString Это сообщение отредактировал(а) leniviy - 13.12.2008, 01:10 |
|||
|
||||
BasilL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 26.5.2005 Где: Челябинск обл. Репутация: нет Всего: 1 |
leniviy,
т.е. если я правильно понял - возможен такой вариант решения: изменить структуру Message так, чтобы только последнее поле имело непостоянный размер, например так
на крайняк, можно и последнее поле запихнуть в какойнить char[256]... но не хотелось бы Верна идея? |
|||
|
||||
leniviy |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
Всё равно одновременное использование AnsiString как поля структуры +
не сработает. можно так:
но тогда надо и другие части проги менять:
Сложно? Конечно. Потому лучше сделайте, как я посоветовал в пред. посте. Оставьте структуру, как была, но напишите 2 функции для передачи/приёма такой структуры и 2 функции для передачи/приёма AnsiString |
||||||||||
|
|||||||||||
BasilL |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 26.5.2005 Где: Челябинск обл. Репутация: нет Всего: 1 |
leniviy, спс за советы... у самого есть еще пара мыслей - на выходных поковыряю ))
|
|||
|
||||
J0ker |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
скорее класс-оболочка над char массивом а как иначе вы предлагаете использовать recv? другой вопрос в несоответствии кол-ва принимаемых данныы размерам структуры в C++ массивы нулевой длины не разрешены |
|||
|
||||
leniviy |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 552 Регистрация: 8.2.2003 Где: Спб Репутация: нет Всего: 5 |
||||
|
||||
J0ker |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 986 Регистрация: 17.9.2008 Репутация: 1 Всего: 14 |
это не имеет отношения к конкретному компилятору отступление от стандарта - потенциальный баг |
||||
|
|||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 1 Всего: 50 |
||||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |