Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.07.2010, 20:36   #1
WereWind
 
Регистрация: 22.07.2010
Сообщений: 3
По умолчанию Как разбить структуру на пакеты?

Собственно необходимо перевести исходную структуру в массив char-ов, разбить на куски, склеить и собрать новую структуру.
Никак не могу взять в толк, как куски собственно склеивать( Помогите

Код:
#include <iostream>
#include <string.h>
#include <string>
#include <deque>
#include <list>

using namespace std;

typedef list <string> Textual_list_t;

struct InnerStruct
{
	char TextInfo[52];
	int	  SomeCounter;
};

typedef char PieceForPack[10];


struct OuterStruct
{
	int			NumericInformation;
	char		TextInfo[52];
	bool		Flag;
	int			innerCount;
	InnerStruct inStr[10];
};

int main (int argc, char* argv[])
{
	//Заполнеяем структуру
	OuterStruct MyStructure;
	MyStructure.NumericInformation = 14;
	MyStructure.innerCount=6;
	strcpy (MyStructure.TextInfo, "Hop Heigh! It's just a beginning!");
	MyStructure.Flag=true;
	for (int i=0; i<6; i++)
	{
		strcpy (MyStructure.inStr[i].TextInfo,"I love cookies");
		MyStructure.inStr[i].SomeCounter=i;
	}

	cout<<MyStructure.NumericInformation<<endl<<MyStructure.TextInfo<<endl<<MyStructure.Flag<<endl<<MyStructure.inStr[3].TextInfo<<endl<<MyStructure.inStr[4].SomeCounter<<endl<<endl;
	
	char *charArray=reinterpret_cast<char*>(&MyStructure);
	//Размер ее - чуть меньше 400 б. Думаю все-таки привязать величину к размеру пакета
	size_t sz = 400;

	char packet[10];
	
	char *rawbytes = new char[sz];
		
		for(int j=0; j<sz; j+=sizeof(packet))
		{
			memcpy(packet, (charArray+j), sizeof(packet));
			
			for (i=0; i<10; i++)
				
		{
			cout<<packet[i];
		}

	strcat(rawbytes, packet);

	}
	
	//Нужны ли эти строки?///////////////////////////////////////////////////

		for (i=0; i<400; i++)
			rawbytes--;
	//////////////////////////////////////////////////////////////////////////
		for (i=0; i<400; i++)
		{
			cout<<*rawbytes;
			rawbytes++;
		}


	OuterStruct MySecondStruct = *(OuterStruct*)rawbytes;;
	i=0;

	cout<<MySecondStruct.NumericInformation<<endl<<
MySecondStruct.TextInfo<<endl<<
MySecondStruct.Flag<<endl<<
MySecondStruct.inStr[3].TextInfo<<endl
<<MySecondStruct.inStr[4].SomeCounter<<endl<<endl;




	return 0;
}
WereWind вне форума Ответить с цитированием
Старый 23.07.2010, 20:56   #2
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Никак не могу взять в толк, как куски собственно склеивать( Помогите
memcpy и клейте
подпись
liljon вне форума Ответить с цитированием
Старый 24.07.2010, 17:09   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Что собственно нужно сделать? Зачем кусками копировать? OuterStruct нормально копируется байт в байт, соответственно конструктор копии, созданный компилятором автоматически, подойдет.
Код:
OuterStruct MyStructure;
...
OuterStruct MyStructure2(MyStructure); // Создание копии структуры
...
Это конечно если я С++ еще не забыл, а то компилятора под руками нет для проверки.
pu4koff вне форума Ответить с цитированием
Старый 22.08.2010, 15:54   #4
WereWind
 
Регистрация: 22.07.2010
Сообщений: 3
По умолчанию

Спасибо за ответы)

Апну тему, потому что код остался тем же самым. Сейчас необходимо сделать так, чтобы в массиве inStr, что в OuterStruct, могло помещаться любое число элементов, от 1 до, допустим, тысячи. Причес вариант с объявлением размера массива в 1000 не годится. Заранее спасибо
WereWind вне форума Ответить с цитированием
Старый 22.08.2010, 16:58   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Использовать контейнер из STL? Вместо массива объявляем
Код:
std::vector<InnerStruct> InStr;
И вперёд
pu4koff вне форума Ответить с цитированием
Старый 22.08.2010, 17:10   #6
WereWind
 
Регистрация: 22.07.2010
Сообщений: 3
По умолчанию

Вектор тоже не годится. Вроде он довольно непредсказуемо переживает перегонку в байтовый массив и обратно (это нужно для отправки по сети). Вы точно уверены, что так его не сглючит?
WereWind вне форума Ответить с цитированием
Старый 22.08.2010, 21:43   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от WereWind Посмотреть сообщение
Вектор тоже не годится. Вроде он довольно непредсказуемо переживает перегонку в байтовый массив и обратно (это нужно для отправки по сети). Вы точно уверены, что так его не сглючит?
Раз это для сети, то можно сделать так:
разбиваем данные на две логические части: заголовок пакета и тело пакета. В заголовке содержатся все постоянные величины. А в теле - все строки переменной длины и прочие нефиксированные данные.
Если используется TCP, то можно сначала отправить заголовок с указанием числа InnerStruct, а потом уже по отдельности каждую структуру.
А вот на приёмнике можно уже использовать и вектор и строки и что угодно. Да и в передатчике не обязательно хранить всё в том виде, в каком оно будет отправляться по сети. Храним всё так, как удобно, а вот уже для отправки по сети, конвертируем в соответствующий вид.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно перехватывать пакеты полученные из инета??? xxxSHAPxxx Помощь студентам 1 12.04.2010 00:23
как увидеть реляционную структуру SQL? Bendebej SQL, базы данных 5 03.02.2010 15:05
Как разбить число на цифрыКак разбить число на цифры: 3241 => 3,2,4,1 (Pascal) Banderas123 Помощь студентам 3 07.12.2009 18:26
Как усложнить структуру ссылки? vlad-55 JavaScript, Ajax 1 05.03.2009 20:15
Как лучше организовать структуру MySQL? Romanbl4 PHP 7 26.06.2008 23:46