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

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

02.07.2016, 17:37. Показов 1041. Ответов 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
656 / 409 / 76
Регистрация: 21.09.2008
Сообщений: 1,407
06.07.2016, 16:41
gogosolo, внимательно посмотрите на типы полей в структуре ClientMess. Там указатели на строки (адреса), а не сами строки. Осознаёте разницу?
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 16:53  [ТС]
Но в серверной структуре Mess точно такие же типы. В чем тогда разница?
0
656 / 409 / 76
Регистрация: 21.09.2008
Сообщений: 1,407
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
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru