Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15

Сокеты и структура

02.07.2016, 17:37. Показов 994. Ответов 6

Студворк — интернет-сервис помощи студентам
Постараюсь объяснить кратко и доступно. Делаю программу которая проводит контроль поступающих заявок. В клиентской части происходит оформление заявки, а в серверной - принятие и управление. Пытаюсь отправить структуру на сервер (структура состоит только из строковых переменных), но к серверу приходят только пустые строки, либо приходят, но неправильные (выскакивает ошибка "Access violation address...."). Пробовал разные варианты оформления структуры, но ничего не выходит. Помогите. Любая помощь по делу будет полезна.

Код этих частей:

Клиент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct TMess
{
 char * fam;
 char * name;
 char * otch;
 char * otdel;
 char * problem;
 char * podrobno;
 char * IP;
}ClientMess;
 
..........
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
AnsiString fam = Edit1->Text;
AnsiString name = Edit2->Text;
AnsiString otch = Edit3->Text;
AnsiString otdel = Edit4->Text;
AnsiString problem = ComboBox1->Text;  
AnsiString IP = Powersock1->LocalIP;
 
ClientMess.fam = fam.c_str();
ClientMess.name = name.c_str();
ClientMess.otch = otch.c_str();
ClientMess.otdel = otdel.c_str();
ClientMess.problem = problem.c_str();
ClientMess.podrobno = Memo1->Lines->GetText();
ClientMess.IP = IP.c_str();
 
ClientSocket1->Socket->SendBuf(&ClientMess.fam,sizeof(ClientMess.fam));
}
Сервер:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct TMess
{
 char * fam;
 char * name;
 char * otch;
 char * otdel;
 char * problem;
 char * podrobno;
 char * IP;
}Mess;
 
.............
 
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
Socket->ReceiveBuf(&Mess,sizeof(Mess));
Memo1->Lines->Add(Mess.fam);
Memo1->Lines->Add(Mess.name);
Memo1->Lines->Add(Mess.otch);
Memo1->Lines->Add(Mess.otdel);
Memo1->Lines->Add(Mess.problem);
Memo1->Lines->Add(Mess.podrobno);
Memo1->Lines->Add(Mess.IP);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2016, 17:37
Ответы с готовыми решениями:

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти хранятся несколько массивов, которые необходимо обработать...

Структура современной связи как структура системы власти - как структура государственного управления
Структура современной связи всё больше становится структурой государственного управления, в особенности финансового государственного...

Структура таблицы для ввода номенклатуры в БД Аксесс 2003+ структура изделия
Доброго времени суток форумчане! Продолжаю писать свою самоделку, возник вопрос: Номенклатуру в БД надо вводить в одно поле (...

6
-1 / 2 / 1
Регистрация: 03.04.2012
Сообщений: 53
02.07.2016, 23:26
Цитата Сообщение от gogosolo Посмотреть сообщение
ClientMess.podrobno = Memo1->Lines->GetText();
У меня показывает, что метод GetText() компонента TStrings, что является Memo1->Lines, возвращает wchar_t*, а не char*. Но почему у вас не появляется ошибка типа Cannot convert 'wchar_t *' to 'char *', возможно происходит преобразование, а возможно ваша версия TStrings возвращает char*.
Если же происходит преобразование, то очевидно, оно протекает некорректно, используйте wcstombs().
0
650 / 403 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
06.07.2016, 16:41
gogosolo, внимательно посмотрите на типы полей в структуре ClientMess. Там указатели на строки (адреса), а не сами строки. Осознаёте разницу?
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 16:53  [ТС]
Но в серверной структуре Mess точно такие же типы. В чем тогда разница?
0
650 / 403 / 76
Регистрация: 21.09.2008
Сообщений: 1,396
06.07.2016, 17:47
gogosolo, я наверное, плохо изъясняюсь. Использую метод аналогий.
Допустим, я должен вам дать пакет с провизией - колбасой, сыром, хлебом, молоком, кофе. Но вместо натуральных продуктов я даю вам записки, где находятся эти продукты, но доступа к хранению у Вас нет, т.е. записи вида "колбаса в холодильнике на нижней полке", "сыр на средней полке холодильника", "хлеб в хлебнице", "кофе в шкафчике" бесполезны. Сейчас-то понятно?
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 18:00  [ТС]
Тогда каким образом мне нужно передать строку, размера которой я якобы не знаю? Сначала определять длину строки с поля, а только потом создавать структуру из char типов с заданными размерами? Или есть еще варианты?
0
-1 / 2 / 1
Регистрация: 03.04.2012
Сообщений: 53
08.07.2016, 01:13
Цитата Сообщение от gogosolo Посмотреть сообщение
ClientSocket1->Socket->SendBuf(&ClientMess.fam,sizeof(ClientMe ss.fam));
а должно быть
C++
1
ClientSocket1->Socket->SendBuf(&ClientMess,sizeof(ClientMess));
Это раз. А два:
C++
1
2
3
4
5
6
7
8
9
10
11
struct TMess {
 char fam[256];
 char name[256];
 char otch[256];
 char otdel[256];
 char problem[1024];
 char podrobno[2048];
 unsigned int IP; //потому что ip можно представить в виде числа, например 
                  //77.88.21.8
                  //77 * 256^3 + 88 * 256^2 + 21 * 256^1 + 8 * 256^0 = 1297618184
}
а потом
C++
1
2
3
4
5
6
7
strcpy(ClientMess.fam,fam.c_str());
strcpy(ClientMess.name, name.c_str());
strcpy(ClientMess.otch, otch.c_str());
strcpy(ClientMess.otdel, otdel.c_str());
strcpy(ClientMess.problem, problem.c_str());
strcpy(ClientMess.podrobno, Memo1->Lines->GetText().c_str());
ClientMess.IP = IP.ToInt();//здесь найти метод, который вернет адрес числом
Можно поступить иначе, и передавать все одной строкой, склеенной из нескольких вводимых пользователем, по какому нибудь определенному сплиттеру. Или вообще jsonом. Но его довольно тяжко разбирать, можно намучаться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.07.2016, 01:13
Помогаю со студенческими работами здесь

В текстовом файле структура – информация о компьютерах. Структура с полями: название, стоимость.
Ребят, помогите пожалуйста, 29 июня экзамен по "Основы программирования",кто сколько сможет сделать задач, тем всей группой поставим...

Структура проектов, структура выходного каталога и пользовательские расширения сборок
В общем есть решение из нескольких проектов. Есть зависимости от сторонних библиотек. Требуется сделать так, чтобы при компиляции этого...

Структура «База», сущности «Универсам» и «Продукты», структура «Товар»
1. Создать структуру «База», включающую не менее 3 полей. 2. Создать сущности «Универсам» и «Продукты» описанной структуры. 3. Создать...

структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ
структура array предназначена для хранения строки типа char. Структура имеет функцию, которая позволяет изменить символ с указанным...

Структура=>Список=>Снова структура.
Определите предикат argrpl(Term,N,Arg,NTerm), заменяющий N-ый компонент в структуре Term на новый компонент Arg и помещающий результат в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru