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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2010, 23:55   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
Стрелка Проблема с копированием

Столкнулся с такой проблемой: нужно скопировать в буфер экземпляр класса Message, но копируется только 4 байта и то мусор какой-то. Подскажите пожалуйста в чем ошибка.

Код:
class Message{
	
	protected:
	
	string message;
	string from;
	string target;
	SOCKET client_from;
	public:
	
	Message();
	Message(string& cl_from,string& cl_to,string& mess,SOCKET& sock_from);
	Message(const Message& mes);
	Message& operator =( Message&);
};

Копирование:
   Message mes;
   char *buf;
   buf=(char *)malloc(sizeof(mes));
   memcpy(buf,&mes,sizeof(mes));
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Stilet; 28.04.2010 в 16:48.
Sam Gold вне форума Ответить с цитированием
Старый 28.04.2010, 04:10   #2
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Во-первых Вы слишком мало данных дали. Программу целиком - в студию Данный кусок нормально работает (я не поленился, скомпилил). Ну в том плане, что нормально считает размер класса и переносит статические данные в буфер.

Во-вторых, как Вы определяете, что скопировано было 4 байта? Я надеюсь не строкой через printf выводите?

В-третьих, std::string содержит в себе динамические данные, которые не будут скопированы таким образом, будут скопированы указатели на них Вы уверены, что именно это Вам нужно?
theos вне форума Ответить с цитированием
Старый 28.04.2010, 16:25   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Программа:

Методы класса:
Код:
Message::Message(){
	message="";
	from="";
	target="";
	client_from=0;
	
	std::cout << "You are entered NULL message " << std::endl;
}

Message::Message(string& cl_from,string& cl_to,string& mess,SOCKET& sock_from){
	//===============================================

	(*this).from=cl_from;
	//==========================

	(*this).target=cl_to;
	//==========================

	(*this).message=mess;
	//===========================
	(*this).client_from=sock_from;
}

Message::Message(const Message& mes){
	(*this).message=mes.message;
	(*this).target=mes.target;
	(*this).from=mes.from;
	(*this).client_from=mes.client_from;

	cout<<" constructor by copy"<<endl;
	
}


Message& Message:: operator =(Message& mes){
	(*this).from=((*this).from).append(mes.from);
	(*this).target=((*this).target).append(mes.target);
	(*this).message=((*this).message).append(mes.message);
	(*this).client_from=mes.client_from;
	return *this;
}

string Message::get_from(){
	return from;
}


string Message::get_target(){
	return target;
}

string Message::get_mess(){
	return message;
}

SOCKET Message::get_socket(){
	return client_from;
}


int Message::get_from_length(){
	return from.length();
}


int Message::get_target_length(){
	return target.length();
}


int Message::get_message_length(){
	return message.length();
}


Message::~Message(){
	}

Функции:
Код:
BOOL UploadMess( Message mes,SOCKET client){
 //=================Size of message================
   char size[100];
   itoa(sizeof(mes),size,10);
   send(client,size,100,0);//==============Передача размера  Message

   char *buf;
   buf=(char *)malloc(sizeof(mes));
   memcpy(buf,&mes,sizeof(mes));
  
   cout<<sizeof(mes)<<endl;
   
   cout<<sizeof(buf)<<endl;   //=========размер буфера
	int sending=send(client,buf,sizeof(mes),0);

	if(sending<=0){
		std::cout<<" The size of message<=0 bytes!"<<std::endl;
		return FALSE;
	}
	return TRUE;
}


Message RecvMess( SOCKET client){

	char *buf_size;
	buf_size=(char *)malloc(100);
	recv(client,buf_size,100,0);
	int size=atol(buf_size);
	
	

   Message messag;
	char *buf;
	buf=(char *)malloc(size);
	int rec=recv(client,buf,size,0);
	if(rec<=0){
		std::cout<< "Error  RecvMess. Size of message <= 0 byte ! " << std::endl;
		
	}

   memcpy(&messag,buf,size);
 
	free(buf_size);
	free(buf);

	
	return messag;
}


DWORD WINAPI Agents(LPVOID param){


	SOCKET client;
	client=*((SOCKET *)param);
	

//==============================================
   
   Message mess;
   mess=RecvMess(client);
   std::cout << "Upload new message from : " << mess.get_from() << std::endl;
   std::cout << " Message : " << mess.get_mess();

}
Мне вообще нужно на клиентской стороне создать объект Message, занести его в буфер и передать на сервер)
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Stilet; 28.04.2010 в 16:49.
Sam Gold вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с копированием текста в wordе Foxx Microsoft Office Word 23 07.06.2021 10:23
Проблема с копированием файла mish@ Общие вопросы Delphi 6 14.03.2010 17:57
помогите с копированием Romuald Microsoft Office Excel 5 11.01.2009 21:27
Проблема с копированием Ronni10 Операционные системы общие вопросы 1 29.04.2008 09:39
Проблема с копированием каталога!!! Volkogriz Общие вопросы Delphi 15 18.10.2007 07:57