0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15

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

02.07.2016, 17:37. Показов 1001. Ответов 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
651 / 404 / 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
651 / 404 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru