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

ServerSocket и ReceiveBuf. Двойное отправление

05.07.2016, 20:58. Показов 1303. Ответов 9

Студворк — интернет-сервис помощи студентам
В программе отправляю структуру через SendBuf на сервер. На сервер эта структура приходит прекрасно и я загружаю ее данные в массив сразу при чтении ReceiveBuf. Но очень часто при отправке структуры на сервер приходит структура два раза, причем вторая структура пустая. Следствие: в таблице в место одной строки добавляются две (последняя пуста). И так происходит достаточно часто. С клиента отправляю структуру только один раз и ничего больше не отправляю. На сервере структура читается один раз и нигде больше нет подобной строк. В чем может быть дело?
Миниатюры
ServerSocket и ReceiveBuf. Двойное отправление  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.07.2016, 20:58
Ответы с готовыми решениями:

Tsocketclient, как работать с Socket->ReceiveBuf()
пишу приложение для работы на Tsocketclient подскажите как работать с Socket->ReceiveBuf()

Help function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer;
Здраствуй всезнающий All! Хочу задать вопрос относительно function TCustomWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer; ...

Отправление писем
Хочу отсылать письмами заранее сформированные файлы, и генерировать, и слать хочу в один клик... итак ищу библиотеку. Нахожу smtp-mail,...

9
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
06.07.2016, 10:11
gogosolo, покажите как вы посылаете и принимаете
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 11:12  [ТС]
Пожалуйста. Прикреплю и структуру сразу.

Сервер:
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
33
struct TMess
{
 char fam[40];
 char name[40];
 char otch[40];
 char otdel[100];
 char problem[100];
 char podrobno[5000];
 char IP[20];
}Mess;
 
.....
void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
Socket->ReceiveBuf(&Mess,sizeof(Mess));
 
StringGrid1->RowCount = rowCount;
StringGrid1->Cells[0][rowCount] = Mess.fam;
StringGrid1->Cells[1][rowCount] = Mess.otdel;
StringGrid1->Cells[2][rowCount] = Now();
StringGrid1->Cells[3][rowCount] = Mess.problem;
StringGrid1->Cells[4][rowCount] = Mess.podrobno;
StringGrid1->Cells[5][rowCount] = Mess.IP;
 
//Блок, который добавлял в Мемо записи как на скрине. Необязательная часть.
Memo1->Lines->Add(rowCount);
Memo1->Lines->Add(Mess.otdel);
Memo1->Lines->Add(Mess.problem);
 
//Увеличивает счетчик строк StringGrid
rowCount++;
}
Клиент:
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[40];
 char name[40];
 char otch[40];
 char otdel[100];
 char problem[100];
 char podrobno[5000];
 char IP[20];
}ClientMess;
 
.....
 
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
strcpy(ClientMess.fam,Edit1->Text.c_str());
strcpy(ClientMess.name,Edit2->Text.c_str());
strcpy(ClientMess.otch,Edit3->Text.c_str());
strcpy(ClientMess.otdel,Edit4->Text.c_str());
strcpy(ClientMess.problem,ComboBox1->Text.c_str());
strcpy(ClientMess.podrobno,Memo1->Lines->GetText());
strcpy(ClientMess.IP,Powersock1->LocalIP.c_str());
 
ClientSocket1->Socket->SendBuf(&ClientMess,sizeof(ClientMess));
}
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
06.07.2016, 12:03
gogosolo, вы контролируете сколько данных реально принимает ReceiveBuf? что будет если сообщение распилит на две и более частей?
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 12:07  [ТС]
Ну если подходить так к этому вопросу, то не контролирую. Надеюсь, что все байты структуры придут один раз.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
06.07.2016, 12:08
gogosolo, попробуйте не надеется и посмотреть что будет
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 12:12  [ТС]
Только вопрос: как это контролировать? Есть ли в гугле информация по этому?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
06.07.2016, 13:56
Цитата Сообщение от gogosolo Посмотреть сообщение
как это контролировать?
в случае вашего протокола все просто - у вас приходят исключительно структуры. то есть нужно на сервере завести кроме структуры Mess еще и размер полученных данных, скажем Len. во время приема данных нужно заносить их по адресу структуры со смещением Len. что бы не занести больше данных чем недостающий хвост структуры нужно принимать не sizeof(Mess) а sizeof(Mess)-Len данных. после приема данных увеличиваем Len на величину принятых данных. как только выясняется что Len = sizeof(Mess) мы обнуляем Len и выполняем часть кода которая потребляет сформированный Mess. если Len меньше чем sizeof(Mess) то ничего не делаем (ждем пока данные придут)
0
0 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 15
06.07.2016, 16:56  [ТС]
Но на старте принятия данных Len должно иметь какое-то значение, чтобы производить смещение. Тогда чему равно начальное значение? 0?
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
06.07.2016, 17:28
gogosolo, да
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.07.2016, 17:28
Помогаю со студенческими работами здесь

Отправление email
Привет, есть форма с с такими полями Имя, Телефон, Коментарий, и все фот я написал php скрипт <?php $name =...

Отправление данных
Ребят объясните есть форма в ней я записываю данные, отправляю.. выводит сообщение данные отправлены, пытаюсь обновить страницу пишет что...

Отправление email
Доброго всем времени суток!) Ребят, срочно нужна Ваша помощь. Нужен блок кода, позволяющий отправлять письма на почту. Блок кода должен...

Отправление файлов
Доброго времени суток дорогие форумчане! Столкнулся с такой задачкой. Есть скрипт,пусть его путь www.sait1.ru/gate.php <? ...

отправление формы
подскажите что делаю не так. создаю сайт и при нажатии на обратную связь происходит переход на страницу Forma, не могу найти ошибки,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru