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

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

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

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

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

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

Описан класс:
Код:
#include <windows.h>
#include <winsock.h>
#include <string>


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&);
	string get_from();
	string get_target();
	string get_mess();
	SOCKET get_socket();
	int get_from_length();
	int get_target_length();
	int get_message_length();
	~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<<buf<<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;
}
в функции UploadMess в buf копируется только 4 байта, а при вызове RecvMess на сервере Windows завершает работу сервера. Подскажите пожалуйста, где ошибка.
Единственный способ стать умнее - играть с более умным противником.

Последний раз редактировалось Sazary; 27.04.2010 в 19:55.
Sam Gold вне форума Ответить с цитированием
Старый 28.04.2010, 10:40   #2
mrChester
Я
Форумчанин
 
Аватар для mrChester
 
Регистрация: 24.04.2010
Сообщений: 693
По умолчанию

Попробуй
Код:
   char *buf=new char (sizeof(mes.message));
   memcpy(buf,&mes,sizeof(mes.message));
   cout<<buf<<endl;
возможно это из-за преобразования типов.
У себя не проверял, пока не было возможности
Все персонажи вымышлены, все совпадения случайны.
Если жизнь игра, тогда я её разработчик ©.

Последний раз редактировалось mrChester; 28.04.2010 в 10:42.
mrChester вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Установка XP на SATA и все-все-все Alex Cones Операционные системы общие вопросы 5 16.03.2010 17:07
все слова с нечетным количеством букв подходят для "ёлочной" рекурсии. Все буквы слова расположены в форм no_to Помощь студентам 0 04.01.2010 16:06
memcpy: Копируем double по половинкам Роман Радер Общие вопросы C/C++ 2 11.11.2009 00:08
не копирует фаил командой copyfile Dozent Общие вопросы Delphi 3 21.06.2009 00:25
в начале все отрицательные, затем все положительные элементы в матрице motaro Паскаль, Turbo Pascal, PascalABC.NET 2 07.03.2008 19:16